본문 바로가기

Algorithm/백준

[백준/JAVA] 🥈 1138번 한 줄로 서기

문제

N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.

어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.

사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.

각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 줄을 선 순서대로 키를 출력한다.

예제 입출력

 

 

 

풀이

자기보다 큰 사람이 몇 명인지의 정보를 저장한 arr 배열

List에 답을 넣어줄 때, arr배열의 인덱스를 몇 번째 사람인지의 값으로, arr배열의 값을 인덱스 정보로 사용한다.

이때, 역방향으로 접근하지 않으면 원하는 값이 나오지 않으니 주의 !!

 

 

 

 

고쳐봐야 할 코드 (쩡민이랑 같은 로직) -> int n 입력 부분 수정

줄 세운 결과를 저장할 line 배열을 사람 개수만큼 0으로 초기화 해두고, 자기보다 큰 사람 수만큼 0을 찾아 건너뛰고, 그 다음 0 칸에 넣어준다.

"N은 10보다 작거나 같은 수"인데 왜 한 자리 숫자만 받았을까 바보!!

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        //int n = Character.getNumericValue(br.readLine().charAt(0));
        int n = Integer.parseInt(br.readLine()); //수정
        int[] countLeft = new int[n+1];
        int[] line = new int[n+1];
        st = new StringTokenizer(br.readLine());
//        자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 정보
        for (int i = 1; i <= n; i++) {
            countLeft[i] = Integer.parseInt(st.nextToken());
        }

        for (int i = 1; i <= n; i++) {
            lineUp(line, countLeft[i], i);
        }

        for (int i = 1; i <= n; i++) {
            System.out.print(line[i] + " ");
        }
    }

    static void lineUp(int[] line, int countZero, int value) {
//        countZero 개수만큼 0을 찾아 건너뛰고, 다음 자리에 value를 넣음
//        countZero=2라면, 0을 두 개 찾고 다음 0의 위치에 value를 넣어야 함.
        int count = 0;
        for (int i = 1; i < line.length; i++) {
            if(line[i]==0) count++; //0 만나면 세어주고
            if(count == countZero+1) { //현재 세고있는 count가 들어가야 할 위치에 도달하면
                line[i]=value; //줄 세워주기
                break;
            }
        }
    }
}