본문 바로가기
Algorithm/백준 알고리즘

BOJ(2605) - Kotlin

by 클리마 2022. 6. 7.
728x90

문제

점심시간이 되면 반 학생 모두가 한 줄로 줄을 서서 급식을 탄다. 그런데 매일 같이 앞자리에 앉은 학생들이 앞에 줄을 서 먼저 점심을 먹고, 뒷자리에 앉은 학생들은 뒤에 줄을 서 늦게 점심을 먹게 된다. 어떻게 하면 이러한 상황을 바꾸어 볼 수 있을까 고민하던 중 선생님이 한 가지 방법을 내 놓았다. 그 방법은 다음과 같다.

학생들이 한 줄로 줄을 선 후, 첫 번째 학생부터 차례로 번호를 뽑는다. 첫 번째로 줄을 선 학생은 무조건 0번 번호를 받아 제일 앞에 줄을 선다. 두 번째로 줄을 선 학생은 0번 또는 1번 둘 중 하나의 번호를 뽑는다. 0번을 뽑으면 그 자리에 그대로 있고, 1번을 뽑으면 바로 앞의 학생 앞으로 가서 줄을 선다. 세 번째로 줄을 선 학생은 0, 1 또는 2 중 하나의 번호를 뽑는다. 그리고 뽑은 번호만큼 앞자리로 가서 줄을 선다. 마지막에 줄을 선 학생까지 이와 같은 방식으로 뽑은 번호만큼 앞으로 가서 줄을 서게 된다. 각자 뽑은 번호는 자신이 처음에 선 순서보다는 작은 수이다.

예를 들어 5명의 학생이 줄을 서고, 첫 번째로 줄을 선 학생부터 다섯 번째로 줄을 선 학생까지 차례로 0, 1, 1, 3, 2번의 번호를 뽑았다고 하자, 첫 번째 학생부터 다섯 번째 학생까지 1부터 5로 표시하면 학생들이 줄을 선 순서는 다음과 같이 된다.

  • 첫 번째 학생이 번호를 뽑은 후 : 1
  • 두 번째 학생이 번호를 뽑은 후 : 2 1
  • 세 번째 학생이 번호를 뽑은 후 : 2 3 1
  • 네 번째 학생이 번호를 뽑은 후 : 4 2 3 1
  • 다섯 번째 학생이 번호를 뽑은 후 : 4 2 5 3 1

따라서 최종적으로 학생들이 줄을 선 순서는 4, 2, 5, 3, 1이 된다.

줄을 선 학생들이 차례로 뽑은 번호가 주어질 때 학생들이 최종적으로 줄을 선 순서를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 학생의 수가 주어지고 둘째 줄에는 줄을 선 차례대로 학생들이 뽑은 번호가 주어진다. 학생의 수가 100 이하이고, 학생들이 뽑는 번호는 0 또는 자연수이며 학생들이 뽑은 번호 사이에는 빈 칸이 하나씩 있다.

출력

학생들이 처음에 줄을 선 순서대로 1번부터 번호를 매길 때, 첫째 줄에 학생들이 최종적으로 줄을 선 순서를 그 번호로 출력한다. 학생 번호 사이에는 한 칸의 공백을 출력한다.

 

나의 접근방법

완성된 배열에 뽑은 번호만큼 자리를 서로 이동하며 줄을 세우는 것이 삽입정렬이랑 비슷하다고 생각했다. 삽입정렬은 크기순으로 자리를 이동해가면서 줄을 세우지만 이번 문제는 해당 인덱스만큼만 자리를 이동하면 된다.

혼자서 arrayList를 이용해서 삽입정렬을 구현하다가 arrayList.add()가 두가지 방법으로 매개변수를 받는 것을 알게 되었다. 기존에는 (element)만 매개변수를 받는 것으로 알고 있었는데, (index, element) 두 개를 받는 것이었다. 이렇게 add() 메소드를 썼을 때 기존 인덱스의 요소는 어떻게 하는지 궁금해서 일단 돌려보았는데 기존 인덱스 요소들은 하나씩 뒤로 미뤄준다!!

그래서 아주 쉽게 삽입정렬같은 알고리즘을 구현해서 풀 수 있었다.

코드

/* 줄 세우기 */

import java.util.Scanner

fun main() = with(Scanner(System.`in`)) {
    val arrayList = arrayListOf<Int>().apply {
        repeat(nextInt()) { num ->
            this.add(this.size-nextInt(), num+1)
        }
    }

    for (e in arrayList) {
        print("$e ")
    }
}
728x90

'Algorithm > 백준 알고리즘' 카테고리의 다른 글

BOJ(17608) - Kotlin  (0) 2022.06.10
BOJ(10104) - Kotlin  (0) 2022.06.09
BOJ(2609) - Kotlin  (0) 2022.06.07
BOJ(1436) - Kotlin  (0) 2022.06.03
BOJ(1181) - Kotlin  (0) 2022.06.02