숭이
[시뮬레이션] 백준 3190번. 뱀 (파이썬) | 삼성 SW 역량 테스트 기출 문제 본문
# Question
https://www.acmicpc.net/problem/3190
룰이 완전히 똑같진 않지만, 이 게임이랑 비슷한 느낌!
# Solution
## code
# 백준 3190번 뱀
import sys
input = sys.stdin.readline
def rotate_func(rot_way, node_way):
if rot_way == 'D': # 시계 회전
if node_way == 4:
node_way = 1
else:
node_way += 1
else: # 반시계 회전
if node_way == 1:
node_way = 4
else:
node_way -= 1
return node_way
N = int(input())
board = [[0 for i in range(0, N)] for i in range(0, N)]
board[0][0] = 1
K = int(input())
for i in range(0, K):
x, y = map(int, input().split())
board[x-1][y-1] = -1 # 빈칸:0, 사과:-1, 뱀칸(몸통방향)-우:1, 하:2, 좌:3, 상:4
L = int(input())
rotate = []
for i in range(0, L):
rotate.append(list(input().split()))
iter = 1 # 초
head_x, head_y = 0, 0 # 머리 좌표
tail_x, tail_y = 0, 0 # 꼬리 좌표
dx = [1, 0, -1, 0] # 우, 하, 좌, 상
dy = [0, 1, 0, -1]
rot_time = int(rotate[0][0]) # 다음 방향 변환 시간
# for i in range(0, N):
# print(board[i])
# print(" ")
while True: # 반복문 한 번 당 1초
# print(f"{iter}초 후:")
# 다음 머리좌표
head_way = board[head_y][head_x]
head_x += dx[head_way-1]
head_y += dy[head_way-1]
# 벽이나 몸에 부딪히지 않는지 확인 (종료조건)
if head_x >= N or head_y >= N or head_x < 0 or head_y < 0: # 벽과 부딪힘
break
if board[head_y][head_x] != 0 and board[head_y][head_x] != -1: # 몸과 부딪힘
break
# 사과 확인
if board[head_y][head_x] != -1: # 사과가 없다
# 꼬리 이동
tail_way = board[tail_y][tail_x]
board[tail_y][tail_x] = 0
tail_x += dx[tail_way-1]
tail_y += dy[tail_way-1]
board[head_y][head_x] = head_way # 머리 이동
# 회전
if iter == rot_time:
board[head_y][head_x] = rotate_func(rotate[0][1], head_way) # 회전
rotate = rotate[1:]
if len(rotate) == 0:
rot_time = -1
else:
rot_time = int(rotate[0][0])
iter += 1
# for i in range(0, N):
# print(board[i])
# print(" ")
print(iter)
## explanation
반복문을 이용해 1초(게임 속 1초)마다 동작을 수행한다.
Flow:
1. 다음 머리좌표 확인
2. 이동했을 때 벽이나 몸에 부딪히지 않는지 확인 (반복문 종료조건)
3. 사과가 있는지 확인하고, 머리와 꼬리 이동
4. 회전해야 하면 회전
포인트
- 2차원 배열 board: 게임판 위에 뱀과 사과의 위치를 표현한다. ★
- 뱀 몸통이 향하는 각 방향을 적어둔다. (1: 동, 2: 남, 3: 서, 4: 북) ★ ★
ㄴ 뱀이 꼬불꼬불할 수도 있기 때문에 이 부분을 어떻게 구현할지 고민했었고(꼬리를 이동할 때 어느 방향으로 이동할 지), 각 몸통의 방향을 적어둠으로써 해결할 수 있었다.
아래에서 각 과정을 보면 더 이해하기 쉽다!
예제 입출력 2의 수행 과정이다.
'코딩 테스트' 카테고리의 다른 글
[시뮬레이션] 백준 14499번. 주사위 굴리기 | 삼성 SW 역량 테스트 기출 문제 (2) | 2024.10.08 |
---|---|
[그래프 탐색] 깊이 우선 탐색을 스택으로 구현하는 세 가지 방법 | 백준 2606번 파이썬 (1) | 2024.04.20 |
[그래프 탐색] 백준 2667번. 단지번호붙이기 (파이썬) | DFS, BFS (0) | 2024.04.11 |
[그래프 탐색] 깊이 우선 탐색 알고리즘이란 (DFS, Depth First Search) | 백준 1260번 (0) | 2024.04.10 |
[그리디 알고리즘] 백준 2457번. 공주님의 정원 (파이썬) (0) | 2024.03.31 |