[김태원 알고리즘] 역수열 (그리디)
사용 언어: Python3
문제
풀이
내 풀이
N = int(input())
lst = list(map(int, input().split())) # 역수열
orig = [] # 원수열
for i in range(N, 0, -1):
orig.insert(lst[i-1], str(i)) # insert(idx,val): idx번째에 val 추가
print(" ".join(orig))
orig
라는 원수열을 담을 리스트를 선언한다.- 역수열(
lst
)의 맨 “마지막” 원소부터 순회하면서 원수열에 원소를 하나씩 추가한다.- 역수열:
5 3 4 0 2 1 1 0
8
을orig
의 0번째에 추가 (원수열:8
)7
을orig
의 1번째에 추가 (원수열:8 7
)6
을orig
의 1번째에 추가 (원수열:8 6 7
)5
을orig
의 2번째에 추가 (원수열:8 6 5 7
)4
을orig
의 0번째에 추가 (원수열:4 8 6 5 7
)3
을orig
의 4번째에 추가 (원수열:4 8 6 5 3 7
)2
을orig
의 3번째에 추가 (원수열:4 8 6 2 5 3 7
)1
을orig
의 5번째에 추가 (원수열:4 8 6 2 5 1 3 7
)
- 역수열:
다른 풀이 - 1
N = int(input())
lst = list(map(int, input().split())) # 역수열
orig = [0] * N # 원수열
for i in range(1, N+1): # 1부터 N까지의 수를 차례로 넣기
cnt = 0
for j in range(N):
# 0을 카운트하고 그 다음 빈칸(=0)을 찾아 넣기 (이미 차지하고 있으면(=0이 아니면) 안됨)
if orig[j] == 0:
cnt += 1
if cnt == lst[i-1] + 1: # 그 다음 0인 칸에 넣기
orig[j] = i
break
for x in orig:
print(x, end=" ")
orig
라는 원수열을 담을 리스트를 선언한다.- 원수열을 0으로 초기화한 뒤 1부터 N까지의 수를 차례로 추가한다.
- 이때 빈칸(=0)을 카운트하여 빈칸을 역수열 값만큼 확보한 뒤에 다음 빈칸에 추가해야한다!
- 역수열:
5 3 4 0 2 1 1 0
- 원수열:
0 0 0 0 0 0 0 0
- 0을 5번 카운트 한 뒤
1
을 다음 빈칸에 추가 (원수열:0 0 0 0 0 1 0 0
) - 0을 3번 카운트 한 뒤
2
를 다음 빈칸에 추가 (원수열:0 0 0 2 0 1 0 0
) - 0을 4번 카운트 한 뒤
3
를 다음 빈칸에 추가 (원수열:0 0 0 2 0 1 3 0
)- 🌟 빈칸이 아니면 추가히지 못한다! 건너뛰고 다음 빈 칸을 만나면 추가한다.
- 0을 0번 카운트 한 뒤
4
를 다음 빈칸에 추가 (원수열:4 0 0 2 0 1 3 0
) - 0을 2번 카운트 한 뒤
5
를 다음 빈칸에 추가 (원수열:4 0 0 2 5 1 3 0
) - 0을 1번 카운트 한 뒤
6
를 다음 빈칸에 추가 (원수열:4 0 6 2 5 1 3 0
) - 0을 1번 카운트 한 뒤
7
를 다음 빈칸에 추가 (원수열:4 0 6 2 5 1 3 7
) - 0을 0번 카운트 한 뒤
8
를 다음 빈칸에 추가 (원수열:4 8 6 2 5 1 3 7
)
- 0을 5번 카운트 한 뒤
다른 풀이 - 2
바로 위와 같은 로직인데 구현이 다른 버전이다!
N = int(input())
lst = list(map(int, input().split())) # 역수열
orig = [0] * N # 원수열
for i in range(N):
for j in range(N):
if lst[i] == 0 and orig[j] == 0: # 이미 차지하고 있으면(=0이 아니면) 안됨
orig[j] = i+1
break
elif orig[j] == 0:
lst[i] -= 1 # 0일 때 하나씩 감소 (0을 카운트하기 위해)
for x in orig:
print(x, end=" ")
💛 개인 공부 기록용 블로그입니다. 👻