[파이썬 알고리즘 문제풀이] - Section4 / 이분탐색(결정알고리즘) & 그리디 알고리즘 - 10

Chooooo·2023년 1월 29일
0

🎈 역수열(그리디)

1부터 n까지의 수를 한 번씩만 사용하여 이루어진 수열이 있을 때, 1부터 n까지 각각의 수 앞에 놓여 있는 자신보다 큰 수들의 개수를 수열로 표현한 것을 역수열이라 한다.
예를 들어 다음과 같은 수열의 경우
4 8 6 2 5 1 3 7
1앞에 놓인 1보다 큰 수는 4, 8, 6, 2, 5. 이렇게 5개이고,
2앞에 놓인 2보다 큰 수는 4, 8, 6. 이렇게 3개,
3앞에 놓인 3보다 큰 수는 4, 8, 6, 5 이렇게 4개......

따라서 4 8 6 2 5 1 3 7의 역수열은 5 3 4 0 2 1 1 0 이 된다.
n과 1부터 n까지의 수를 사용하여 이루어진 수열의 역수열이 주어졌을 때, 원래의 수열을 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫 번째 줄에 자연수 N(3<=N<100)이 주어지고, 두 번째 줄에는 역수열이 숫자 사이에 한 칸의 공백을 두고 주어진다.

▣ 출력설명
원래 수열을 출력합니다.

▣ 입력예제 1
8
5 3 4 0 2 1 1 0

▣ 출력예제 1
4 8 6 2 5 1 3

import sys
sys.stdin = open("input.text", "rt")

N = int(input())
data = list(map(int, input().split()))

res = [0] * N
for i in range(N):
    for j in range(N):
        if data[i] == 0 and res[j] == 0: #res는 들어갈 수 있는 자리.
            res[j] = i+1
            break
        elif res[j] == 0: #빈자린데 자기 자리 아님.
            data[i] -= 1 #빈자리일때마다 한칸씩 뺴줘야지!

for x in res:
    print(x, end = " ")

🎃 코멘트
역수열을 통해 기존 수열을 찾기. 정렬된 자료를 자기 자리 찾아 넣는다고 생각하고 접근해야했다.
정렬된 수열의 원래 위치를 찾는다고 생각했어야 했다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글