본문 바로가기
코딩테스트

[Python] 백준 1138번 - 한 줄로 서기

by 박매트 2024. 6. 21.

 
https://www.acmicpc.net/problem/1138


n = int(input())

arr = list(map(int, input().split()))
answer = [0]*n

for i in range(n):   
    cnt = 0
    for j in range(n):
        if cnt == arr[i] and answer[j] == 0:
            answer[j] = i + 1
            break
        elif answer[j] == 0:
            cnt += 1
                
print(' '.join(map(str, answer)))

 
봐도봐도 이해가 안 가서 글을 참고하였다...
참고 : https://gudwns1243.tistory.com/31

[백준][파이썬]1138번: 한 줄로 서기

문제 출처 : www.acmicpc.net/problem/1138 1138번: 한 줄로 서기 첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이

gudwns1243.tistory.com


작은 수 부터 자리를 채워나가면 된다.
 
큰 사람이 왼쪽에 몇 명이 있어야 하는지 주어진 값을 보고 그만큼의 빈자리를 비워 둔 후에 값을 채우면 된다.
예시를 들어보면
2 1 1 0 이라고 주어진 경우
 
0 0 1 0  // 왼쪽에 두명이 있으므로 2칸을 비워두고 자리를 채운다.
0 2 1 0 
0 2 1 3
4 2 1 3
의 순서대로 칸을 채워나가게 된다. 
이 경우에 앞에 0인 경우 cnt를 올려주고, 아닐 경우에는 패스해주면서 빈 자리를 체크해주며
채워가는 answer리스트가 0이면서 cnt가 앞에 필요한 사람의 수와 같아 질 경우 해당 자리에 값을 넣고 break를 해주면 된다.

Kotlin 버전 답

import java.util.*

fun main() {
    val scanner = Scanner(System.`in`)
    val n = scanner.nextInt()

    val arr = IntArray(n) { scanner.nextInt() }
    val answer = IntArray(n) { 0 }

    for (i in 0 until n) {
        var cnt = 0
        for (j in 0 until n) {
            if (cnt == arr[i] && answer[j] == 0) {
                answer[j] = i + 1
                break
            } else if (answer[j] == 0) {
                cnt++
            }
        }
    }

    println(answer.joinToString(" "))
}