본문 바로가기
ALGORITHM/백준

[BOJ/PYTHON] 20921. 그렇고 그런 사이

by 뭉망뭉 2022. 3. 27.
# silver2-20921. 그렇고 그런 사이

import sys
put = sys.stdin.readline

# 왼쪽 수가 오른쪽보다 큰 경우(그렇고 그런 사이)가 k가지여야 함

n, k = map(int, put().split()) # n명, k개의 경우 만들기
answer = []
visited = [0] * (n+1)
maxN = n

# 첫 번째 사람한테 n번(제일 높은 값) 쪽지 주면 n-1만큼 생김

while k:
    if maxN - 1 <= k: # 만들어야하는 수보다 생길 수가 작을 때
        visited[maxN] = 1 # 방문 처리
        k -= (maxN - 1) # 생긴 수만큼 k(만들어야 하는 수) 소진
        answer.append(maxN) # 높은 번호의 쪽지 줌
    # (if문) 해당 번호 쪽지 줬으니까 소진됨 -> 그다음 제일 큰 수로 갱신
    # (if문 x) 생길 수를 1 줄여서 다시 도전
    maxN -= 1 

for i in range(1, n+1):
    if not visited[i]: 
        answer.append(i) # 낮은 수부터 순차적 배치

print(' '.join(map(str, answer)))

문제가 '그렇고 그런 사이'를 찾아내는 건데 축약하면 '왼쪽 수가 오른쪽보다 큰 경우(그렇고 그런 사이)가 k가지여야 할 때, 정수 배열 순서'를 구하는 것이다.

 

그리디이고, '5 1 4 3 2'의 예제 출력에서 첫 번째 사람한테 가장 높은 수를 배정하면 '그렇고 그런 사이'가 n-1만큼 생김을 찾아내면 문제 푸는 실마리를 잡을 수 있다. 

 

리스트는 join으로 출력하면 된다는 것만 기억하고 

print(' '.join(answer))을 했는데, TypeError: sequence item 0: expected str instance, int found 에러가 나오길래 

단순히 스트링으로 감싸줬었다. print(' '.join(str(answer)))

이렇게 하니까 내가 원하는 형태가 나오는 게 아니라서 서치를 해봤더니 역시 map으로 감싸는 거더라. 잊어먹지 말자.

int형 리스트에 join을 적용하려면 map(str, 리스트명)을 이용해 문자열로 합치기!

 

댓글