python-for-coding-test icon indicating copy to clipboard operation
python-for-coding-test copied to clipboard

p118 게임개발 문제 답안 예시 오류?있는거같아요

Open SeoHyungjun opened this issue 4 years ago • 1 comments

다른분이 질문하셨는지 대충 찾아봤는데 못찾아서 올립니다...

https://github.com/ndb796/python-for-coding-test/blob/master/4/4.py 에서 nx, ny를 정하고

조건문 "if d[nx][ny] == 0 and array[nx][ny] == 0:" 를 들어가게되면

4 4 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1

과 같은 상황에서는 0,0에서 움직이지 못하므로 1이 맞다고 생각하는데, 2로 나오게됩니다.

(nx, ny)가 (0, -1)일때 c에서는 out of index? 상황인데 파이썬의 경우 맨 마지막으로 돌아가기때문에 발생한 문제라고 생각되네요...

# n 세로, m 가로
n, m = map(int, input().split())
# 시작위치 (a, b), 방향(direction) d
a, b, d = map(int, input().split())

# map_arr / 바다 1, 육지 0
map_arr = []
# check / 가본곳 1, 안가본곳 0
check = [[0] * m for _ in range(n)]

for _ in range(n):
    map_arr.append(list(map(int, input().split())))

# 방향 / 북 0, 동 1, 남 2, 서 3
change = [(-1, 0), (0, 1), (1, 0), (0, -1)]

change_cnt = 0
# 첫 위치는 무조건 육지라고 가정
answer = 1
# 시작위치에서 check[a][b] 방문처리
check[a][b] = 1

while True:
    # 바라보는 방향을 반시계 방향으로 1번 변경
    # 반시계방향으로 돌면 0 -> 3 -> 2 -> 1
    d -= 1
    change_cnt += 1
    if d == -1:
        d = 3

    next_a = a + change[d][0]
    next_b = b + change[d][1]

    if next_a >= 0 and next_a < n and next_b >= 0 and next_b < m:
        # 왼쪽 방향에 가보지 않은 칸 존재하고 육지라면
        if check[next_a][next_b] == 0 and map_arr[next_a][next_b] == 0:
            # 위치를 변경하고
            a = next_a
            b = next_b
            # 이동한 위치를 체크
            check[a][b] = 1
            # 방향 전환 횟수 초기화
            change_cnt = 0
            # 이동한 육지 수 증가
            answer += 1
            continue

    # 4방향 모두 확인했으면 
    if change_cnt == 4:
        # 바라보는 반대 방향으로 한칸 이동 but 뒤가 바다일 경우 움직임 멈춤
        next_a = a - change[d][0]
        next_b = b - change[d][1]

        if map_arr[next_a][next_b] == 0:
            a = next_a
            b = next_b
            change_cnt = 0
        else:
            break

print(answer)

if next_a >= 0 and next_a < n and next_b >= 0 and next_b < m: 와 같이 맵의 크기를 벗어나는지 확인하는게 필요하다 생각되는데

혹시 제가 문제를 잘 못 이해한건지 아니면 문제가 잘못 풀린건지 궁금합니다.

SeoHyungjun avatar Jan 08 '21 07:01 SeoHyungjun

안녕하세요, @SeoHyungjun 님!

좋은 질문 감사합니다.

문제의 입력 조건에서는 "맵의 외곽은 항상 바다로 되어 있다."라고 명시되어 있습니다. 말씀하신 대로, 만약 입력 조건에 이러한 조건이 없다면 푸는 사람 입장에서는 index out of range 오류를 예방하기 위한 로직이 들어갈 필요가 있습니다.

또한 아래와 같은 입력 예시를 들어 주셨는데요. (말씀드렸듯이 맵의 외곽은 항상 바다로 되어 있으므로 이런 입력은 들어오지 않겠지만요.)

4 4 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1

위 입력에 대하여 오류가 발생하지 않는 이유는 파이썬은 음수 인덱스(index)를 허용하기 때문입니다. 예를 들어 d[0][-1]에 접근하게 되면 d[0][3]에 접근하는 것과 같습니다. 그래서 의도치 않게 d[0][3]에 대하여 방문한 것으로 처리되어 2라는 출력 결과가 나오게 되는 것입니다.

감사합니다. 나동빈 드림

ndb796 avatar Jan 11 '21 18:01 ndb796