메모리 | 시간 | 코드길이 |
---|---|---|
29380KB | 64ms | 685B |
N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.
어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.
사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.
각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.
첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.
4
2 1 1 0
첫째 줄에 줄을 선 순서대로 키를 출력한다.
4 2 1 3
number = int(input())
count = list(map(int, input().split()))
line = [i for i in range(1,number+1)]
for i in range(number-2, -1, -1):
num_count = 0
index = 0
start = i
next_index = i+1
while(num_count!=count[i]):
if line[next_index] > line[start]:
num_count += 1
index = start+1
temp = line[start]
line[start] = line[index]
line[index] = temp
start = index
next_index = start+1
for i in line:
print(i, end=' ')
어떻게든 풀어보려고 하다보니 뭔가 지저분해보이기도 한다. 내가 문제를 푼 과정은 다음과 같다.
[1,2,3,4]
에서 i번째 인덱스에 있는 값의 왼쪽에 큰 값이 n개 있어야 한다.[1,2,3,4]
에서는 큰 값이 무조건 오른쪽에 있으므로 index가 더 큰 값들을 차례로 확인해서 큰 값이 n개가 카운트 되었을 때의 인덱스에 있는 값과 원래의 값(i에 있는 값)을 swap한다.처음에 while문 안에 i를 집어 넣었다가 n이 1보다 클 때 제대로 swap되지 않는 문제가 발생했었다. 현재 loop를 돌고 있는 i를 사용하게 되면 더 복잡해지기 때문에 i의 값을 start
, next_index
로 받아서 다시 작성해보니 제대로 실행되었다.
풀었다는 성취감은 있었지만 더 좋은 풀이가 있을 것 같아서 풀이를 찾아보았다.
def _1138():
N = int(input())
arr = list(map(int, input().split(' ')))
line = []
for i in range(len(arr)-1, -1, -1):
line.insert(arr[i], i+1)
# insert(a, b)는 리스트의 a번째 위치에 b를 삽입하는 함수이다.
# print(f'line={line}')
for i in line:
print(i, end=' ')
_1138()
for문을 돌때마다 다음과 같이 line에 값이 들어간다.
line=[4]
line=[4, 3]
line=[4, 2, 3]
line=[4, 2, 1, 3]
주어진 리스트를 뒤에서부터 돌면서 값을 확인한다. line에는 큰 수부터 차례로 들어가게 된다. 주어진 리스트의 값이 n일 때 무조건 line에는 들어갈 값보다 큰 수들만 존재하므로 line의 n번째 인덱스에 해당 숫자를 넣어주면 된다.