jyamethyst21 님의 블로그

백준 25955번 - 'APC는 쉬운 난이도 순일까, 아닐까?' (PYTHON 풀이) 본문

CODING 💻

백준 25955번 - 'APC는 쉬운 난이도 순일까, 아닐까?' (PYTHON 풀이)

jyamethyst21 2026. 2. 22. 16:17

문제:

 

등급과 난이도를 순서대로 한 단어로 붙여서 N개만큼 입력할 때 등급, 난이도를 고려해서 쉬운 난이도 순서대로 입력받았다면 OK를, 그렇지 않다면 KO를 출력하고 올바른 순서대로 수정하는 문제이다.

 

풀이:

N = int(input())
li = input().split()
dic = {'B' : 1, 'S' : 2, 'G' : 3, 'P' : 4, 'D' : 5}

sorted_li = sorted(li, key = lambda x: (dic[x[0]], -int(x[1:])))

diff = []
for i in range(N):
    if li[i] != sorted_li[i]:
        diff.append(i)

if len(diff) == 0:
    print('OK')
else:
    print('KO')
    a = sorted_li[diff[0]]
    b = sorted_li[diff[1]]

    if (dic[a[0]], -int(a[1:])) <= (dic[b[0]], -int(b[1:])):
        print(a,b)
    else:
        print(b,a)

N개의 수를 입력받고 띄어쓰기로 구분하여 각 등급을 입력받은 뒤 li에 넣는다.

그리고 필자같은 경우는 각 등급이 알파벳순이 아니기 때문에 크기를 결정하기 위해 딕셔너리를 사용해서 값을 넣어 레벨을 정해주도록 하였다.

이후 sorted를 활용하여 두가지의 정렬 조건을 넣는다. 먼저 첫번째로는 티어를 기준으로, 그리고 티어가 동일하다면 티어 이후의 문제 난이도를 기준으로 정렬한다. 이때 현재 입력받은 값은 문자열이므로 int로 바꿔서 난이도를 입력받고 난이도가 쉬울수록 숫자가 크기 때문에 -를 붙여서 내림차순하도록 한다.

여기까지 예를 들어 보면, 값이 'S20 B100 B200'이라면 첫번째 조건으로 S, B를 딕셔너리 값에 맞게 정렬하고 동일하다면 그 뒤의 값인 100, 200(B 기준)을 내림차순으로 정렬하게 된다.

이 과정을 거치면 최종적으로 sorted_li는 해당 조건이 적용된 정답 값이 들어가있다.

 

이제 미리 만들어놓은 정답값과 입력받은 값을 비교해서 문제에서 원하는 것처럼 출력하도록 하여야 한다.

diff라는 리스트를 따로 만들고, 입력받은 값과 정답 값의 각 자리를 비교해서 동일하지 않다면 diff에 해당 값의 인덱스를 저장한다.

그 후 diff의 길이가 0이라면 전부 일치했다는 의미이므로 OK를 출력하고, 그렇지 않다면 재정렬을 위한 조건을 실행한다.

일단 재정렬 전 KO를 출력하라고 되어있기 떄문에 이를 출력하고, 문제에서는 한번만 순서 바꾸기가 가능하다고 되어있기 때문에 diff엔 2개의 값만 들어있으므로 인덱스값 0,1만을 활용하여 정답을 찾아 각각 a,b에 넣는다.

 

그 후 앞서서 사용했던 정렬 조건을 a,b를 대입해 그대로 다시 사용해서 두 값을 정렬하도록 한다.

해당 조건은 sorted 함수의 key 파라미터에서도 사용할 수 있지만, 튜플 내에서도 바로 조건 비교가 가능하다.

즉, dic[a[0]]와 dic[b[0]]를 첫번째로 비교한 뒤, 동일하다면 -int(a[1:])와 -int(b[1:])까지 비교해서 조건을 결정한다.

예를 들어 비교할 대상이 a = 'S10',  b= 'S300'이라면, 처음엔 S에 해당하는 딕셔너리의 값인 2를 넣어 비교하고 동일하니 두번째 조건인 -10과 -300에 대해 비교할 것이다. 즉, '(2,-10) <= (2,-300)'이 되기 때문에 거짓이 되어 낮은 난이도인 b, a 순으로 출력하게 될 것이다.