알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 14499 주사위굴리기(시뮬레이션)

개발자 덕구🐾 2022. 7. 13. 14:38
728x90

 

 

 

 

삼성문제 특 ) 

그냥 빡구현 

 

 

1,2,3,4 번이 동서남북이 아니라 동서북남이다!!!

 

+) 주사위는 지도의 바깥으로 이동시킬 수 없다.

만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다

 

-> nx,ny를 구하고 지도를 벗어나는지 확인해주어야한다. 

 

 

코드 : 

#  동서북남 
dx = [0,0,-1,1] 
dy = [1,-1,0,0]


def move(dir) :
    global x,y
    nx,ny = x + dx[dir], y + dy[dir]
    if 0<=nx<n and 0<=ny<m :
        if dir == 0 : # 동
            dice[0], dice[3], dice[5],dice[2] = dice[2],dice[0],dice[3],dice[5]
        elif dir == 1 : # 서
            dice[0], dice[2], dice[5],dice[3] = dice[3],dice[0],dice[2],dice[5]
        elif dir == 2 : # 북
            dice[0], dice[4], dice[5],dice[1] = dice[1],dice[0],dice[4],dice[5]
        else : # 남 
            dice[0], dice[4], dice[5],dice[1] = dice[4],dice[5],dice[1],dice[0]
            
        if mp[nx][ny] == 0 : # 칸에 있는 숫자가 0 
            mp[nx][ny] = dice[0] # 주사위 아랫면 숫자가 칸으로 
        else : 
            dice[0] =  mp[nx][ny] 
            mp[nx][ny] = 0
        x,y = nx,ny 
        print(dice[5])   # 윗면 출력 
                 
if __name__=="__main__" :
    n,m,x,y,k = map(int,input().split())
    mp = [list(map(int,input().split())) for i in range(n)]
    order = list(map(int,input().split()))
    dice = [0]*6
    for o in order :
        move(o-1)  #   배열은 0 index, 주어지는 방향은 1 index

 

 

 

나는 설마 진짜로 하나하나 주사위 값을 바꿔줄지 생각못했다. 

 

 

 

주사위는 0-index로 배열으로 만들어준다. 

문제에 나와있는 숫자를 그대로 하되 0-index로 만들기 위해 1씩 빼주면 왼쪽의 그림처럼 생각할 수 있다. 

 

 

 

 

 

 

 

 

 

 

 

 

이 주사위를 머릿속에서 왼쪽, 오른쪽,  위, 아래로  돌려서  어디에 있는 값이 어디로 가면 되는 지 생각해주면 된다. 

 

 

 

이렇게 하나하나 차분히 생각하면 된다. 

이를 코드로 만들어주면 끝-!

 

 

 

 

동서남북으로 주사위를 돌린 형태를 그려주면?

 

 

 

 

복습하면서 만든 코드 : 

# 동 서 북 남      
dx = [0,0,-1,1]
dy = [1,-1,0,0]


if __name__=="__main__" :
    dice = [0]*6
    n,m,x,y,k = map(int,input().split())
    mp = [list(map(int,input().split())) for _ in range(n)]
    order = list(map(int,input().split()))
    
    for dir in order : 
        nx,ny = x + dx[dir-1] , y + dy[dir-1]
        
        # 만약 이 범위를 벗어나면 -> 무시 
        if 0<=nx< n and 0<=ny<m :
            if dir == 1 :
                dice[2],dice[0],dice[3],dice[5] = dice[5],dice[2],dice[0],dice[3]
            elif dir == 2 :
                dice[3],dice[0],dice[2],dice[5] = dice[5],dice[3],dice[0],dice[2]
            elif dir == 4 :
                dice[5],dice[4],dice[0],dice[1] = dice[1],dice[5],dice[4],dice[0]
            elif dir == 3 :
                dice[0],dice[4],dice[5],dice[1] = dice[1],dice[0],dice[4],dice[5]
                
            
            if mp[nx][ny] == 0 :
                mp[nx][ny] = dice[0]
            else :
                dice[0] = mp[nx][ny] 
                mp[nx][ny] = 0 
            x,y = nx,ny
            print(dice[5])

 

 


 

 

 

참고 블로그 : 

https://chldkato.tistory.com/160

 

백준 14499 주사위 굴리기 (파이썬)

https://www.acmicpc.net/problem/14499 14499번: 주사위 굴리기 첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개..

chldkato.tistory.com

 

 

 

복습 : 

20220714

✅ 20220913

반응형