본문 바로가기

알고리즘/삼성 기출

주사위 굴리기 [백준 14499번]

문제

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