Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](시뮬) 백준 3190번 : 뱀 본문
728x90
<접근 방법>
- 시뮬레이션 유형의 문제이므로 문제에서 설명한 그대로 구현하도록 한다.
- 사과가 있는 칸을 나타내기 위해 board에 주어진 사과 좌표를 이용해 1로 표기해둔다.
- 방향 전환 정보를 info라는 딕셔너리 형태(info = {X:C})에 담는다. 이때 X는 숫자, C는 문자 형태임에 유의한다.
- 한 칸 바라보고 있는 방향으로 이동하면서
벽이나 몸에 이동할 경우 반복문을 break하여 빠져나오고
사과가 있는 칸이라면 사과를 먹고(board[ni][nj] = 0) 몸을 늘린다.
사과가 없는 칸이라면 몸을 늘리고 꼬리를 당긴다(snake맨앞 정보 지우기). - 기준 좌표를 재설정한다.(si, sj = ni, nj)
- 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
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](DFS) 백준 14500번 : 테트로미노(2가지 방법) (0) | 2024.02.04 |
---|---|
[Python](시뮬) 백준 14499번 : 주사위 굴리기 (2) | 2024.02.03 |
[Python](시뮬) 백준 21610번 : 마법사 상어와 비바라기 (2) | 2024.01.29 |
[Python](시뮬) 백준 21608번 : 상어 초등학교 (2) | 2024.01.28 |
[Python] 백준 20055번 : 컨베이어 벨트 위의 로봇 (0) | 2024.01.28 |