알고리즘 문제(SOL)

[백준/2840/파이썬] 행운의 바퀴

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

 

2840번: 행운의 바퀴

첫째 줄에 마지막 회전에서 화살표가 가리키는 문자부터 시계방향으로 바퀴에 적어놓은 알파벳을 출력한다. 이때, 어떤 글자인지 결정하지 못하는 칸은 '?'를 출력한다. 만약, 상덕이가 적어놓

www.acmicpc.net

Problem

  • 매번 바퀴를 돌릴 때 마다, 상덕이는 화살표가 가리키는 글자가 변하는 횟수와 어떤 글자에서 회전을 멈추었는지를 종이에 적는다.희원이는 상덕이가 적어놓은 종이를 발견했다.
  • 그 종이를 바탕으로 상덕이가 바퀴에 적은 알파벳을 알아내려고 한다.상덕이가 종이에 적어놓은 내용과 바퀴의 칸의 수가 주어졌을 때, 바퀴에 적어놓은 알파벳을 알아내는 프로그램을 작성하시오.

조건

  • 바퀴에 같은 글자는 두 번 이상 등장하지 않는다.
  • 첫째 줄에 바퀴의 칸의 수 N과 상덕이가 바퀴를 돌리는 횟수 K가 주어진다. (2 ≤ N ≤ 25, 1 ≤ K ≤ 100)
  • 다음 줄부터 K줄에는 바퀴를 회전시켰을 때 화살표가 가리키는 글자가 몇 번 바뀌었는지를 나타내는 S와 회전을 멈추었을 때 가리키던 글자가 주어진다. (1 ≤ S ≤ 100)

SOL

문제를 읽었을 때, 확 와닿지 않는 문제였다. 그래서, 입력과 출력값을 보면서, 천천히 하나씩 시뮬레이션 해봤다.

 

상덕이는 화살표가 가리키는 글자가 변하는 횟수(S)

화살표가 가리키는 글자가 변하는 횟수가 의미하는건, 화살표를 기준으로 S번째 위치에 해당 글자가 있는걸 의미한다.

방향은 시계방향으로 돌리니까, 화살표 기준으로 반시계 방향으로 S번째에 있다는 이야기임.

 

이렇게 되면, 원형 큐를 구현하는 문제로 바뀐다.

하지만 python3에는 List rotate기능이 있기 때문에, 그걸 활용해서 문제를 풀었다!

# 요세푸스와 비슷한 문제 .원형 큐
from collections import deque

N, K = map(int,input().split())
w =deque(["?" for _ in range(N)])
used =[0]*26
flag=False

for i in range(K):
    a,b = map(str,input().split())
    a=int(a)
    w.rotate(a)
    if w[0] =="?" and not used[ord(b)-65]: #이미 사용되었는지 chk
        w[0] = b
        used[ord(b)-65] = 1
    elif w[0] == b:
        continue
    else:
        flag=True
        break

if flag:
    print("!")
else:
    for n in w:
        print(n,end="")