N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.
어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.
사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.
각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다. i는 0부터 시작한다.
출력
첫째 줄에 줄을 선 순서대로 키를 출력한다.
예제 입력 1 복사
4
2 1 1 0
예제 출력 1 복사
4 2 1 3
예제 입력 2 복사
5
0 0 0 0 0
예제 출력 2 복사
1 2 3 4 5
예제 입력 3 복사
6
5 4 3 2 1 0
예제 출력 3 복사
6 5 4 3 2 1
예제 입력 4 복사
7
6 1 1 1 2 0 0
예제 출력 4 복사
6 2 3 4 7 5 1
이 문제는 각 사람이 기억하는 “왼쪽에 자신보다 큰 사람이 몇 명 있었는지”라는 조건을 만족하며 줄을 서는 문제입니다.
문제의 핵심은 다음과 같습니다:
입출력을 살펴보도록 하겠습니다.
N
과 각 사람의 조건을 입력받습니다.result
배열을 0으로 초기화하여 각 사람의 배치를 저장합니다.conditions
)에 따라 빈 자리를 탐색합니다.result
배열을 출력합니다.import sys
N = int(sys.stdin.readline().strip())
conditions = list(map(int, sys.stdin.readline().split()))
def sol(N, conditions):
result = [0] * N
for height in range(1, N + 1): # if N = 4, then height: 1, 2, 3, 4
cnt = conditions[height - 1] # cnt = 2, 1, 1, 0
empty_cnt = 0
for i in range(N):
if result[i] == 0:
if empty_cnt == cnt:
result[i] = height
break
empty_cnt += 1
return result
print(*sol(N=N, conditions=conditions))
result
배열을 0
으로 초기화합니다. 각 위치에 사람의 키를 배치합니다.result
배열에 줄 선 순서가 저장됩니다.이번 문제는 조건을 만족하며 배열을 구성해야 하는 구현 및 그리디 알고리즘 유형의 문제였습니다.
break
를 사용하여 불필요한 탐색을 방지하고, 성능을 최적화했습니다.break
)하여 성능을 개선할 수 있었습니다.break
)을 통해 효율성을 고려한 구현을 익혔습니다.이번 문제는 조건에 맞는 위치를 효율적으로 배치하는 연습과 함께, 코드의 효율성을 고려한 설계 방법을 배울 수 있는 좋은 사례였습니다. 앞으로도 조건 처리와 반복문 최적화에 집중해 다양한 문제를 해결해보도록 하겠습니다.
글 읽어주셔서 감사합니다.
매일매일 발전합시다!!