티스토리 뷰

🚀접근하기

 문제 이해하는데 시간이 꽤나 걸렸다.... 예제 입력에서 바퀴를 회전시켰을 때 화살표가 가리키는 글자가 몇 번 바뀌었는지를 나타내는 S와 회전을 멈추었을 때 가리키던 글자가 주어진다고 나와있는데, 이게 무슨 말인지 이해가 잘 안가서 직접 그려봤는데

예제 입력 2를 예로 들면 처음 A에서 회전을 멈추고, A로부터 2번 뒤에 B, B로부터 5번 뒤에 다시 B, B로부터 1번 뒤에 C, C로부터 2번 뒤에 A, A로부터 2번 뒤에 B 이렇게 행운의 바퀴에 넣어준 뒤에 마지막에 시계 방향으로 출력해주면 된다.

 

코드 작성에서 유의해야 할 점은 여러가지의 조건이 있다는 건데, 먼저 첫번 째 조건은 

1. 이미 알파벳이 존재하는 곳에 다른 알파벳을 넣으려고 하면 안된다. (그러나 이미 존재하는 알파벳과 넣으려는 알파벳이 같다면 통과)

2. 바퀴에 같은 글자는 두 번 이상 등장하면 안된다.

 

이 두 가지의 조건을 고려하여 두 가지의 조건을 모두 만족하는 행운의 바퀴를 출력해주면 된다.

🎉코드

N, K = map(int, (input().split(" ")))

d1 = ['?']*N

num = 0
wheel = True

for i in range(K):
    S, alpha = input().split(" ")
    S = int(S)
    num = (num + S) % N
    if d1[num] != '?':    # 이미 알파벳이 존재하는 자리에 다시 넣으려고 할 때
        if d1[num] != alpha: 
            check = False
            break
        else:             # 그러나 이미 존재하는 알파벳과 넣을 알파벳이 같다면 통과
            d1[num] = alpha
    else:
        d1[num] = alpha

for i in range(N):   #바퀴에 같은 글자는 두 번 이상 등장하지 않는다는 조건
    if d1[i] != '?':
        for j in range(i+1, N):
            if d1[i] == d1[j]:
                wheel = False

if wheel:  #유효한 행운의 바퀴이면 (같은 글자 두 번 이상 X, 이미 알파벳이 존재하는 곳에 다른 알파벳을 넣으려는 경우 X)
    for i in range(N):
        print(d1[num % N] , end='')
        if(num >= 0):
            num -= 1
        else:
            num += N-1
else:
    print('!')

일단 d1 이라는 배열을 만들어주고, num = (num + S) % N 이라는 식을 사용하여 원형 리스트의 역할을 할 수 있도록 했다.

위에서 적은 조건들을 만족할 수 있도록 if, else 문으로 조건식을 작성해주었고, 행운의 바퀴가 만들어지지 못하는 조건 즉 이미 알파벳이 존재하는 자리에 다시 넣으려고 할 때 (이미 존재하는 알파벳과 넣으려는 알파벳이 같은 경우 제외), 바퀴에 같은 글자가 두 번 이상 등장할 때엔 wheel = False 라고 해주어 나중에 wheel 이 True인 경우에만 알파벳들이 출력이 되고, wheel = False일 경우 '!'이 출력되도록 해주었다. 

 

그리고 시계 방향으로 알파벳을 출력해주기 위해선 배열에서 인덱스가 -1씩 감소하며 출력이 되어야 했다.

따라서 num이 0 이상일 때는 num 값을 -1씩 감소시켜주고, 0 보다 작을 때는 N-1을 더한, 즉 배열의 마지막 인덱스를 출력해주도록 조건을 작성해주었다.

💪다짐

wheel = False, whee = True 와 같은 boolean 값을 사용하자는 다짐은 예전부터 쭉 해왔었는데... 참 유용한 것 같다. 
사실 처음에 두번 째 조건을 보지 못하고 작성해서 왜 자꾸 틀렸습니다가 뜨는지 이해를 못했었는데, 문제를 잘 읽고 조건을 빼먹지 않고 잘 파악해야겠다.ㅎㅎ

'알고리즘' 카테고리의 다른 글

백준 파이썬 1912번 연속합  (2) 2023.11.14
백준 파이썬 11656번 접미사배열  (1) 2023.11.12
백준 파이썬 1074 Z  (0) 2023.09.26
백준 파이썬 2193 이친수  (1) 2023.09.19
백준 파이썬 2579 계단 오르기  (0) 2023.09.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함