Data Structures & Algorithms

[Algorithms] 결정&그리디 알고리즘-역수열(그리디 알고리즘)

숄구-ml 2022. 5. 17. 10:13

 

  • 저녁에 피곤한 상태에서 풀다가 안풀려서 다음날 아침에 풀었더니 금방 풀렸다. 피곤해도 쉽게쉽게 풀리게끔 계속 알고리즘 공부에 정진!! 
  • 그리디 알고리즘은 현재 직면한 상태를 먼저 해결하자는 관점에서 풀면 해결점이 보이는 것 같다
  • 핵심은 주어진 역수열이 오름 차순 수열의 역수열이라는 점, 앞에서부터 순차적으로 찾아나가면 된다는 점을 잘 알아야 한다는 것  

 

    • 풀이1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
 
# sys.stdin = open("input", "rt")
total_num = int(input())
cnt_ls = list(map(int, input().split()))
 
check_ls = [0]*total_num                    # 숫자가 배정됐는지 아닌지에 대한 check list 겸 수열 정렬 할 리스트
for i, cnt in enumerate(cnt_ls):            # 역수열 리스트 for문
    total = 0
    for idx, check in enumerate(check_ls):  # check 리스트 for문
        if check == 0:                      # 비어있으면
            total += 1                      # 큰 수가 들어올 수 있는 경우니 count해주고
            if total == cnt+1:              # 앞에 큰 수 모두 잘 들어오고 이제 숫자를 넣어 줄 차례
                check_ls[idx]=i+1           
 
for j in check_ls:
    print(j, end=" ")
cs
    • 풀이2
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
 
# sys.stdin = open("input", "rt")
= int(input())
= list(map(int, input().split()))
seq=[0]*n
 
for i in range(n):                    # 역수열 for문
    for j in range(n):                # seq 리스트 for문
        if seq[j]==0 and a[i]==0:     # 칸이 비어있고 큰 수 배치할 칸을 다 찾았으면
            seq[j]=i+1
            break
        elif seq[j]==0:               # 칸이 비어있으면
            a[i]-=1
for k in seq:
    print(k, end=" ")
cs
728x90