https://www.acmicpc.net/problem/32174
문제
주어진 카드 뭉치를 주어진 방법대로 섞고 난 후에 조커의 위치를 찾는 문제이다.
조커는 처음에는 덱 가장 위에 있다. 섞는 방법은 세 가지가 있는데 첫 번째 방법은 아래 카드를 위로 올리는 것이고, 두 번째 방법은 위 카드를 아래로 내리는 것이고, 세 번째 방법은 특정 시점에 섞었던 상태로 덱을 바꾸는 것이다.
풀이
중요한 것은 조커의 위치이다. 즉 나머지 카드들이 무엇이고, 어떤 위치에 있는지는 이 문제에서 관심사가 아니다. 따라서 모든 기준을 조커 위치에 맞추고 생각하는 것이 좋다.
첫 번째 셔플 방법은 아래 카드를 위로 올리는 것인데, 조커 위치로 생각해본다면 올리는 경우만큼 내려가는 것이다. 인덱스로 생각해보면 더해진다. 다만 이때 조커가 덱 가장 아래 갔다가 다시 올라갈 수도 있으므로 계산할 때는 나머지를 구해서 인덱스를 계산해주어야 한다.
두 번째 셔플 방법 역시 첫 번째 방법과 거의 유사하다. 다만 조커 카드가 내려가는 것이 아니라 올라간다.
세 번째 셔플 방법 때문에 셔플 후에는 조커 위치를 기록해놔야 한다. 그리고 세 번째 셔플 방법 대로 덱을 세팅해야 할 경우 기록해놓은 조커 위치를 불러와야 한다. 따라서 조커 위치를 기록할 리스트를 만들어 사용하였다.
문제에서 중요한 아이디어는 덱 전체를 보는 것이 아니라 조커 위치만 보는 것인 듯 하다.
코드
card_n, shuffle_m = map(int, input().split())
joker = 0
memory = [0]
for _ in range(shuffle_m):
select, idx = map(int, input().split())
if select == 1:
joker = (joker + idx) % card_n
memory.append(joker)
elif select == 2:
joker = (joker - idx) % card_n
memory.append(joker)
else:
joker = memory[idx]
memory.append(joker)
print(joker+1)
'Online Judge > Baekjoon' 카테고리의 다른 글
[Baekjoon 3230] 금메달, 은메달, 동메달은 누가? | Python (0) | 2024.08.31 |
---|---|
[Baekjoon 18129] 이상한 암호코드 | Python (0) | 2024.08.31 |
[Baekjoon 32173] 새치기 | Python (0) | 2024.08.31 |
[Baekjoon 22233] 가희와 키워드 | Python (0) | 2024.08.31 |
[Baekjoon 1158] 요세푸스 문제 | Python (0) | 2024.08.31 |