문제
https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지
www.acmicpc.net
내 풀이
삼성은 입력하는 것부터 코드를 짜야해서 조금 번거롭다.
strip()와 split()를 야무지게 썼다.
먼저 주사위를 '동서남북'으로 굴렸을 때 모양이 어떻게 나올지부터 생각하였다.
그리고 [0, 1, 2, 3, 4, 5, 6]을 주사위의 [위쪽, 뒤쪽, 오른쪽, 왼쪽, 앞쪽, 아래쪽]으로 설정하였다.
주사위를 동쪽으로 굴렸을 때 -> '1': [3, 1, 0, 5, 4, 2]
주사위를 서쪽으로 굴렸을 때 -> '2': [2, 1, 5, 0, 4, 3]
주사위를 북쪽으로 굴렸을 때 -> '3': [4, 0, 2, 3, 5, 1]
주사위를 남쪽으로 굴렸을 떄 -> '4': [1, 5, 2, 3, 0, 4]
이렇게 변할 것이라고 그림을 그려가면서 주사위의 모양을 구하였다.
주사위가 보드 밖으로 넘어가면 안 되므로 x와 y를 갱신하기 전에 주사위를 굴리고 난 후 보드 안에 있는지 확인하였다.
보드 안에 있다면 문제에서 하라는 대로 보드의 값이 0인지 아닌지에 따라 주사위 또는 보드의 값을 경신하였다.
마지막으로, 주사위의 위쪽을 출력해야 하므로 dice[0]을 출력하였다.
N, M, x, y, K = map(int, input().strip().split())
board = [input().strip().split() for _ in range(N)]
command = input().strip().split()
dice = ['0']*6
dir = {
'1': [3, 1, 0, 5, 4, 2],
'2': [2, 1, 5, 0, 4, 3],
'3': [4, 0, 2, 3, 5, 1],
'4': [1, 5, 2, 3, 0, 4]
}
for c in command:
if c == '1':
if y + 1 > M-1: continue
y += 1
elif c == '2':
if y - 1 < 0: continue
y -= 1
elif c == '3':
if x - 1 < 0: continue
x -= 1
else:
if x + 1 > N-1: continue
x += 1
dice = [dice[x] for x in dir[c]]
if board[x][y] == '0':
board[x][y] = dice[5]
else:
dice[5] = board[x][y]
board[x][y] = '0'
print(dice[0])
총평
진짜 오랜만에 삼성 기출을 풀어봤다. 원래 다른 문제 풀려고 했으나, 겁먹고 그나마 쉬워 보이는 이 문제를 선택하였다.
쉬워보이는 문제 여러 개를 풀어서 감을 잡는 데에 시간을 써야 할 것 같다.
'알고리즘 > 삼성 기출' 카테고리의 다른 글
퇴사 [백준 14501번] (0) | 2022.09.22 |
---|---|
테트로미노 [백준 14500번] (0) | 2022.09.19 |
로봇 청소기 [백준 14503번] (1) | 2022.09.16 |
연구소 [백준 14502번] (0) | 2022.08.29 |
뱀 [백준 3190번] (0) | 2022.08.29 |