이코테

[이코테] Chapter4-3 구현 / 게임 개발

hellosonic 2023. 2. 20. 11:56

나의 코드 및 설명 (틀렸습니다)

  • n, m : 세로, 가로 크기 저장
  • a, b, d : 캐릭터의 위치 a, b / 캐릭터가 바라보는 방향 d 저장
  • direction : 동, 서, 남, 북 리스트 생성
  • da, db : 캐릭터 움직임 리스트 생성
  • gameMap : 맵이 육지인지 바다인지에 대한 정보를 저장하기 위한 리스트 생성
  • count : 캐릭터가 방문한 칸의 수
  • newA, newB : 이동한 후 캐릭터의 좌표
n, m = map(int, input().split())
a, b, d = map(int, input().split()) # 2, 2,0
direction = [0,1,2,3]
da = [0,-1,0,1]
db = [-1,0,1,0]
count = 0
gameMap = []
for _ in range(n):
    gameMap.append(list(map(int, input().split())))

gameMap[a][b] = 1
count += 1
while True:
    i = 0
    while i < 4:
        newA = a + da[d]  
        newB = b + db[d]
        if gameMap[newA][newB] == 0:
            a ,b = newA, newB
            d = direction[direction.index(d)-1]
            gameMap[a][b] = 1
            count += 1
            i = 0
        else:
            d = direction[direction.index(d)-1]
            i += 1
    newA = a - da[d]
    newB = b - db[d]
    if gameMap[newA][newB] == 0:
        a = newA
        b = newB
        gameMap[a][b] = 1
        count += 1
    else: 
        break
print(count)

교재의 코드 및 설명

###교재의 코드
n, m = map(int, input().split())

#방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
visit_list = [[0]*m for _ in range(n)]

#캐릭터의 위치, 방향을 입력받기
a,b,d = map(int, input().split())
visit_list[a][b] = 1 #현재 위치 방문 처리

#전체 맵 정보 입력받기
gameMap = []
for _ in range(n):
    gameMap.append(list(map(int, input().split())))

#북,동,남,서 방향 정의
da = [-1,0,1,0]
db = [0,1,0,-1]

#왼쪽으로 회전
def turn_left():
    global d
    d -= 1
    if d == -1:
        d = 3

#시뮬레이션 시작
count = 1
turn_time = 0
while True:
    #왼쪽으로 회전
    turn_left()
    nextA = a + da[d]
    nextB = b + db[d]
    #회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
    if visit_list[nextA][nextB] == 0 and gameMap[nextA][nextB] == 0:
        visit_list[nextA][nextB] = 1
        a, b = nextA, nextB
        count += 1
        turn_time = 0
        continue
    #회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
    else:
        turn_time += 1
    #네 방향 모두 갈 수 없는 경우
    if turn_time == 4:
        nextA = a - da[d]
        nextB = b - db[d]
        #뒤로 갈 수 있다면 이동하기
        if gameMap[nextA][nextB] == 0:
            a = nextA
            b = nextB
        #뒤가 바다로 막혀있는 경우
        else:
            break
        turn_time = 0
print(count)

피드백

아.. 너무 어렵다. 이전 문제인 상하좌우, 왕실의 나이트도 어려웠지만 한 두번 풀어보니 이해가 되고 다시 풀어볼 수 있었는데, 이번 문제는 너무 어려웠다. 교재의 풀이는 결코 안보겠다는 오기가 생겨서(그러면서 구글링 통해 다른 사람 풀이는 참고했다..) 거의 3시간 가량을 푼것 같은데 결국 풀지 못했다. 위의 나의 코드도 교재의 입력 예시를 돌려보면 맞게 출력되지만, 다르게 입력해보니 에러가 떴다. (혹시나 해서 참고한 다른 사람 풀이도 돌려봤더니, 에러가 뜬다.. ^^.. )

그런데, 교재 속 저자의 첨언을 보니, IndexError:list index out of range 메시지 가 뜨는 것에 대해, 실무의 코딩은 예외를 고려하여 코드를 짜야하지만, 코딩 테스트는 입력값이 주어지는 경우가 대부분으로, 이런 예외처리를 고려하지 않고 빠르게 코드를 작성하는 데에 목표를 둔다고 한다.. 그럼 맞은건가? 그래도 다른 예외 입력도 완벽하게 구현하고 싶은 것이 나의 마음이다.

그래도 이번 문제를 끝까지 물고 늘어지면서 2중 리스트나, 반복문에 대해 좀 더 심도있게 공부할 수 있었다.

백준 브론즈 문제를 풀면서 기본기를 어느정도 다졌다고 생각했는데, 반복문.. 특히, 반복문 안에 반복문이 들어가는 경우는 아직도 숙달이 필요하다.