코딩 공부

[Python](시뮬) 백준 3190번 : 뱀 본문

삼성 SW 역량 테스트 기출 문제

[Python](시뮬) 백준 3190번 : 뱀

Algomalgo 2024. 1. 30. 20:08
728x90


<접근 방법>

  1. 시뮬레이션 유형의 문제이므로 문제에서 설명한 그대로 구현하도록 한다.
  2. 사과가 있는 칸을 나타내기 위해 board에 주어진 사과 좌표를 이용해 1로 표기해둔다.
  3. 방향 전환 정보를 info라는 딕셔너리 형태(info = {X:C})에 담는다. 이때 X는 숫자, C는 문자 형태임에 유의한다.
  4. 한 칸 바라보고 있는 방향으로 이동하면서
    벽이나 몸에 이동할 경우 반복문을 break하여 빠져나오고
    사과가 있는 칸이라면 사과를 먹고(board[ni][nj] = 0) 몸을 늘린다.
    사과가 없는 칸이라면 몸을 늘리고 꼬리를 당긴다(snake맨앞 정보 지우기).
  5. 기준 좌표를 재설정한다.(si, sj = ni, nj)
  6. info를 통해 방향을 바꿔야하는 turn인지 체크하고 해당 시 변경할 수 있도록 한다.
N = int(input())    # N:보드의 크기
K = int(input())    # K:사과의 개수
board = [[0]*N for _ in range(N)]
directions = {0:(-1, 0), 1:(0, 1), 2:(1, 0), 3:(0, -1)}
si, sj = 0, 0
d = 1   # 처음에는 오른쪽을 본다고 했으므로
snake = [(si, sj)]  # 뱀의 몸 정보

for _ in range(K):
    apple_i, apple_j = map(lambda x: int(x)-1, input().split())
    board[apple_i][apple_j] = 1     # 사과가 있는 칸은 1로 표기

L = int(input())    # 뱀 방향 전환 횟수
info = {}
for _ in range(L):
    X, C = input().split()
    info[int(X)] = C

# 시뮬레이션 시작
turn = 0
while True:
    turn += 1
    # [1] 뱀이 몸길이를 늘려 머리를 다음칸에 위치시킨다.
    ni = si + directions[d][0]
    nj = sj + directions[d][1]
    if not (0<=ni<N and 0<=nj<N) or (ni, nj) in snake:  # 벽이나 몸에 부딪히면 break
        break
    if board[ni][nj] == 1:  # 사과가 있는 칸이라면
        snake.append((ni, nj))  # 몸 늘리기
        board[ni][nj] = 0   # 사과 먹기
    else:
        snake.append((ni, nj))  # 몸 늘리고
        snake = snake[1:]   # 꼬리 당기기

    si, sj = ni, nj

    # [2] 방향 전환 turn에 해당하는지
    if turn in info:    # 해당한다면
        if info[turn] == 'D': d = (d+1)%4   # 'D'면 오른쪽으로 회전
        else: d = (d+3)%4   # 'L'이면 왼쪽으로 회전

print(turn)

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90