Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

러닝머신 하는 K-공대생

1138번: 한 줄로 서기 (구현) 본문

Problem Solving/BOJ

1138번: 한 줄로 서기 (구현)

prgmti1 2021. 2. 5. 17:39

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다

www.acmicpc.net

간단한 아이디어 문제.

 

큰 수부터 아래와 같이 표에 채워넣으면 쉽다. 

arr = [5 3 2 2 0 0] 이란 정보가 주어지면, 먼저 6을 추가한다. 

           6          

5를 추가한다. 

           6           5        

5보다 큰 수가 0개이어야 하므로 0번째 index에 5를 끼어넣자. 

         5            6        

4를 추가한다 

5 4      

 

3을 추가한다. 

5 6 4 3    

3보다 큰 수가 2개 이어야 하므로 2번째 index 뒤에 끼워넣자. 

5 6 3 4    

 

2를 추가한다. 

5 6 3 4 2  

2보다 큰 수가 3개이어야 하므로 3번째 index 에 끼워넣자. 

5 6 3 2 4  

 1을 추가한다. 

5 6 3 2 4 1

1보다 큰 수가 5개이어야 하므로 5번째 index에 끼워넣자. 

끼어넣기는 삽입정렬과 동일하게 두 자리의 위치를 계속 바꿔가며 내려가는 순으로 진행한다.

다만 조건을 현재 위치에서 왼쪽에 있는 수 중 자신보다 큰 수의 개수와 문제에서 준 것과 같은지 확인한다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
= int(input())
arr = list(map(int,input().split()))
ans = []
# 현재 index보다 작은 인덱스 중에서 키가 큰 사람의 수를 구한다.
def cnt_tall(arr,index):
    cnt = 0
    for i in range(index):
        if arr[i] > arr[index]:
            cnt += 1
    return cnt
 
# n번 추가하고 끼어넣자
for i in range(n):
    ans.append(n-i) 
    for j in range(i,0,-1): 
        if cnt_tall(ans,j) == arr[n-i-1]:
            break
        ans[j],ans[j-1= ans[j-1],ans[j]
for i in ans:
    print(i, end= ' ')
 
cs

'Problem Solving > BOJ' 카테고리의 다른 글

20127번: Y-수열 (구현)  (0) 2021.02.07
11056번: 두 부분 문자열 (LCS)  (0) 2021.02.06
1107: 리모컨 (브루트포스)  (0) 2021.02.06
9465번: 스티커 (2차원 DP)  (0) 2021.02.05
6064번: 카잉 달력 (구현)  (1) 2021.02.05
Comments