상세 컨텐츠

본문 제목

[코드트리] 정육면체 한번 더 굴리기(파이썬) 2021 하반기 삼성코딩테스트 기출

알고리즘 공부

by Tabris4547 2022. 10. 8. 15:37

본문

728x90

https://www.codetree.ai/frequent-problems/cube-rounding-again/description

 

코드트리

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

정육면체를 굴리는 것떄문에

생각할 게 많은 문제.

문제를 풀 때, 정육면체가 어떻게 움직이지는지

그림으로 저는 그려놓고 푸는 편입니다.

dice=[0,1,2,3,4,5,6]

으로 둔 다음에

0은 안쓰니깐 냅두고

1~6까지만 다뤄줍니다.

물론 사람에 따라서는

dice=[1,2,3,4,5,6]

이렇게 두고 푸셔도 되긴하는데

이게 참 헷갈리는 부분이라서

저는 위의 방식으로 푸는 걸 좀 더 추천드리는 편입니다.

 

그 다음 문제는 그대로 구현해주면 됩니다.

 

1.주사위 굴리기

-->굴리는 방향이 확정되면 해당 방향대로 정육면체 면 바꿔주기

 

2. 현재 지점의 숫자 bfs로 점수구하기

 

3 . 현재지점의 숫자와 아랫면 비교하기

 

저는 3에서 실수가 좀 있었는데

코드 살펴보다가 바로 파악한 덕분에

헤메는 시간을 줄였습니다.

from collections import deque

dx=[0,1,0,-1]
dy=[1,0,-1,0]
N,M=map(int,input().split())
dice=[0,1,2,3,4,5,6]

room=[list(map(int,input().split())) for _ in range(N)]
sx,sy,sd=0,0,0
answer=0

def c_dir(num,sd):
    global dice
    if dice[6]>num:
        sd=(sd+1)%4
    elif dice[6]<num:
        sd=(sd-1)%4

    return sd


def score(sx,sy):
    global answer
    now_score=room[sx][sy]
    q=deque()
    q.append((sx,sy))
    mapping=set()
    mapping.add((sx,sy))
    while q:
        x,y=q.popleft()
        for d in range(4):
            nx=x+dx[d]
            ny=y+dy[d]

            if nx<0 or nx>=N or ny<0 or ny>=N:
                continue

            if (nx,ny) in mapping:
                continue
            if room[nx][ny]==now_score:
                mapping.add((nx,ny))
                q.append((nx,ny))

    answer+=now_score*len(mapping)
def roll_dice(sx,sy,sd):
    global dice
    nx=sx+dx[sd]
    ny=sy+dy[sd]
    #범위벗어나면 반대방향으로 굴리기
    if nx<0 or nx>=N or ny<0 or ny>=N:
        sd=(sd+2)%4
        nx = sx + dx[sd]
        ny = sy + dy[sd]

    #방향대로 바닥 이동
    #우로가는 경우
    if sd==0:
        dice[1],dice[3],dice[6],dice[4]=dice[4],dice[1],dice[3],dice[6]

    #아래로 가는 경우
    elif sd==1:
        dice[1],dice[2],dice[6],dice[5]=dice[5],dice[1],dice[2],dice[6]
    #좌로 가는 경우
    elif sd==2:
        dice[1],dice[4],dice[6],dice[3]=dice[3],dice[1],dice[4],dice[6]
    #위로가는 경우
    elif sd==3:
        dice[1], dice[5], dice[6], dice[2]=dice[2],dice[1],dice[5],dice[6]

    return nx,ny,sd


for _ in range(M):
    #1. 주사위 굴리기
    sx,sy,sd=roll_dice(sx,sy,sd)
    # print(dice)
    # print(sx,sy,sd)
    #2 현재 지점기준 영역
    score(sx,sy)
    #3. 주시위 방향
    sd=c_dir(room[sx][sy],sd)
print(answer)

 

정육면체 문제가

처음 만나면 상당히 골치아픈 문제 중 하나입니다.

미리미리 정리해주면서

이런 구현에 익숙해지는 걸 추천드립니다.

728x90

관련글 더보기

댓글 영역