# 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, 리스트명)을 이용해 문자열로 합치기!
'ALGORITHM > 백준' 카테고리의 다른 글
[BOJ/PYTHON] 11657. 타임머신 (최단 경로 - 벨만포드) (0) | 2023.05.16 |
---|---|
[BOJ/PYTHON] 18223. 민준이와 마산 그리고 건우 (최단 경로 - 다익스트라) (0) | 2023.05.16 |
[BOJ/PYTHON] 11399. ATM (0) | 2022.03.27 |
[BOJ/PYTHON] 13305. 주유소 (0) | 2022.03.27 |
[BOJ/PYTHON] 23559. 밥 (0) | 2022.03.27 |
댓글