[백준] 1138: 한줄로 서기

rang-dev·2020년 5월 6일
0

코딩테스트 연습

목록 보기
5/13
메모리시간코드길이
29380KB64ms685B

문제

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=' ')

어떻게든 풀어보려고 하다보니 뭔가 지저분해보이기도 한다. 내가 문제를 푼 과정은 다음과 같다.

  • 주어진 리스트(왼쪽에 키가 큰 사람이 몇 명 있는가)에서 맨 마지막은 항상 0일 것이므로 뒤에서 두번째부터 거꾸로 확인해나간다.(키가 큰 사람부터 확인해야 가능한 경우의 수가 더 적기 때문에)
  • 리스트의 i번째 인덱스를 확인했을 때, 키가 큰 사람이 n명 이라면 [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번째 인덱스에 해당 숫자를 넣어주면 된다.

profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢

0개의 댓글