본 내용은 '이것이 취업을 위한 코딩테스트다 with 파이썬' 책을 기반으로 포스팅 하였습니다.
문제
저작권 문제가 될 수 있어 문제는 삭제합니다.
풀이 코드
| 입력 | 출력 |
| 4 4 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 |
3 |
// 초기 입력값
let n = 4
let m = 4
let input = "1 1 0"
let inputMap = [[1,1,1,1],[1,0,0,1],[1,1,0,1],[1,1,1,1]]
var map = Array(repeating: Array(repeating: [Int](), count: n), count: m)
var start = input.components(separatedBy: " ").dropLast().map{Int($0)!}
var direction = Int(String(input.last!))!
// 북 동 남 서
// 0 1 2 3
let step = [[-1,0],[0,1],[1,0],[0,-1]]
/*
[[1], [1], [1], [1]]
[[1], [0], [0], [1]]
[[1], [1], [0], [1]]
[[1], [1], [1], [1]]
*/
// 맵 바다 육지 초기화
for i in 0..<n {
for j in 0..<m {
map[i][j] = [inputMap[i][j]]
}
}
// 시작 위치 방문했으므로 1로 변경
map[start[0]][start[1]] = [1]
// 육지로 이동한 카운트 증가
var result = 1
// 이동 시도한 횟수
var count = 0
while true {
// 방향 90도 회전
switch direction {
case 0:
direction = 3
case 1:
direction = 0
case 2:
direction = 1
case 3:
direction = 2
default:
break
}
// 회전한 방향으로 가기위해 계산해야할 좌표값
let move = step[direction]
// 이동할 최종 위치 좌표값
let dx = start[0] + move[0]
let dy = start[1] + move[1]
if count == 4 {
break
} else if dx >= 0 && dy >= 0 && dx <= 3 && dy <= 3 {
if map[dx][dy].first! == 0 {
map[dx][dy] = [1] // 방문했으므로 1로 변경
start = [dx,dy] // 시작위치 초기화
count = 0 // 카운트 초기화
result += 1 // 이동한 카운트 증가
continue
} else {
count += 1 // 이미 방문한 위치이므로 카운트만 증가
continue
}
} else {
count += 1 // 범위를 벗어났으므로 카운트만 증가
continue
}
}
print(result) // 3
문제 풀이
1. 입력받은 시작 위치와 방향을 start변수에 시작 위치를 정수형 배열로 초기화하고, direction변수에 방향을 초기화 한다.
-. start = [1,1]
-. direction = 0
2. step배열에 방향별로 진행해 나가야하는 좌표값을 초기화 한다.
3. map 배열을 바다/육지(1,0)로 초기화
4. map 배열에서 초기 위치 좌표의 값을 1로 변경
-. 방문한 위치를 체크하는 배열을 만들지 않고 map 배열에서 1로 바꿔주는 이유는 방문한 위치나 바다인 위치로는 이동할 수 없기때문
5. while문으로 반복하면서 switch문으로 direction의 방향에서 반시계 방향으로 방향 바꿔줌
6. dx, dy에 현재 바라보고 있는 방향으로부터 한칸 이동할 좌표값으로 초기화
7. 맨처음 바다인지 체크하는 카운트 값이 4인지 체크한다 (4방향 모두 바다라면 이동할 수 없으므로 반복문 종료)
8. 그다음 이동해야할 좌표가 n x m 범위안에 있는지 n x m 범위를 벗어났는지 체크한다.
9. 이동해야할 좌표가 범위 안에 있다면 바다인지 육지인지 체크한다.
10. 육지라면 map 배열에서 이동한 위치의 값을 1로 변경해주고, start변수도 이동한 위치의 좌표로 변경해준다. 이동할 위치가 바다인지 체크했던 카운트 값도 0으로 초기화해주고, 이동한 카운트값을 1 증가 시켜준다. 바다라면 바다인지 체크하는 카운트 값만 1 증가 시켜준다.
'Algorithm > 이코테 문제풀이' 카테고리의 다른 글
| DFS/BFS - 미로 탈출(Swift) (0) | 2022.08.09 |
|---|---|
| DFS/BFS - 음료수 얼려먹기(Swift) (0) | 2022.08.09 |
| 구현 - 왕실의 나이트(Swift) (0) | 2022.06.11 |
| 구현 - 시각(Swift) (0) | 2022.06.10 |
| 구현 - 상하좌우(Swift) (0) | 2022.06.10 |