Computer Science/Algorithm

[Python 3] BOJ 2818 숙제하기 싫을 때

무니화니 2024. 3. 17. 19:27

 

https://www.acmicpc.net/problem/2818

 

2818번: 숙제하기 싫을 때

상근이는 숙제가 너무 하기 싫어서, 숙제 한 달치를 걸고 창영이와 게임을 하기로 했다. 진 사람은 한 달동안 숙제 두 명분을 해야 한다. 상근이는 영리하게 자신이 어렸을 때, 하던 게임을 하자

www.acmicpc.net

 

 

구현 문제이다. 

 

처음에는, 4개의 행 마다 같은 패턴이 반복된다고 생각했었다.

1번행

2번행

3번행

4번행

1번행 

...

 

하지만 이는 오답이다. 꼭 4행마다 패턴이 반복되는 것은 아니였다.

 

 

하지만, 한 행에서 4개 이상의 열이 존재하면, 이는 반복된다.

예를 들어, 

 

1,4,6,3,1,4,6,3,.... 이런 식으로 말이다.

 

dice=[4,5,1,2,6,3]
dx=[0,0,1]
dy=[1,-1,0] #right, left, down
d=0
answer=0
def roll(d):
    if d==0:
        dice[0],dice[2],dice[5],dice[4]=dice[4],dice[0],dice[2],dice[5]
    elif d==1:
        dice[0],dice[2],dice[5],dice[4]=dice[2],dice[5],dice[4],dice[0]
    else:
        dice[1],dice[2],dice[3],dice[4]=dice[4],dice[1],dice[2],dice[3]

r,c=map(int,input().split())

for i in range(r):
    answer+=dice[2]
    fullroll=(c-1)//4
    answer+=fullroll*(dice[0]+dice[2]+dice[4]+dice[5])
    more=(c-1)%4
    for i in range(more):
        roll(d)
        answer+=dice[2]
    if d==1:
        d=0
    else:
        d=1
    roll(2)

print(answer)

 

dx,dy를 통해 움직임을, roll 함수를 통해서 방향이 주어질 때 dice의 방향의 움직임을 변경하였다.

fullroll이라는 변수는 만약 한 바퀴, 즉 4칸을 움직였을 때, 총 증가하는 점수이다.

열을 4로 나눈 나머지만큼 더 움직여줘야한다. 

이후 다음 행으로 넘어간다.