알고리즘/문제풀이

[BOJ] 1138 한 줄로 서기 (Java)

세동세 2024. 10. 8. 01:39

문제 링크

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

 

문제 이해

개인적으로 무슨 말인지 이해가 안가서 헤맨 문제다. 

간단하게 말하자면, 순서 세우기인데 index번호가 키를 뜻하는 지 몰랐다 (문제에 나와있음에도 불구하고 ㅎㅎ)

 

이 문제는 키가 큰 순서대로 해당하는 order 번호에 넣어주면된다.

고정 리스트를 사용하지 않고 가변 리스트를 사용하면 키큰 아이가 먼저 서고, 키가 작은 아이가 이후에 order에 맞게 섰을 때

order[index]값 자신이 기억하고 있는 "자신보다 키 큰 사람의 수"가 변경되지 않기 때문에 무관하다.

 

이 문제는 ArrayList의 index 개념을 이해했는가 & 응용할 수 있는가를 확인하는 문제같다.

 

예제

7
6 1 1 1 2 0 0

 

풀이 과정

 

 

코드

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * BOJ_1138_한줄서기
 * N명 사람 -> 한줄
 * 오민식 사람 줄서는 위치 기록함
 * 매일 자기가 기록한거랑 사람 줄 위치랑 맞는 지 확인함
 * 자기보다 큰 사람이 왼쪽에 몇명이 있었는지만 기억한다.
 *
 * */
public class BOJ_1138_한줄로서기 {

    static BufferedReader br;
    static StringTokenizer st;
    static StringBuilder sb;

    public static void main(String[] args) throws IOException {

        br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine().trim());
        st = new StringTokenizer(br.readLine().trim());

        int[] list = new int[N + 1];
        for (int idx = 1; idx < N + 1; idx ++) {
            list[idx] = Integer.parseInt(st.nextToken());
        }
        ArrayList<Integer> order = new ArrayList<>();
        // 키 큰 순서대로 순서에 넣는다
        for (int idx = N  ; idx >= 1; idx --) {
            order.add(list[idx], idx); // 몇번째 순서에 몇번째키인지
        }

        sb = new StringBuilder();
        for (int idx : order) {
            sb.append(idx).append(" ");
        }
        System.out.println(sb.toString());
    }
}