[BOJ 2605] 줄 세우기

업데이트:

문제

  • BOJ 2605
  • 문제의 저작권은 Baekjoon Online Judge에 있습니다.

접근방식

차근차근 생각해보면 쉽게 풀리는 문제인데 머릿속으로 계산하려고 하니 난이도에 비해서 오래 걸렸던 문제이다.
배열로 처음 학생들이 가진 번호를 입력받고, 그 크기만큼의 새로운 배열 result를 생성하여 학생들의 번호를 하나씩 뽑을때마다 줄세운 결과를 저장한다. 뽑은 번호만큼 앞으로 가게 되므로 앞으로 가게 될 인덱스부터 현재 뽑힌 학생 끝까지를 오른쪽으로 한칸씩 뒤로 미루면 앞에 세워야할 자리가 비워지고 여기에 현재 학생을 넣으면 된다.

코드

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

//줄세우기
public class Main {
	
	static int[] arr;
	static int[] result; //줄세운 결과
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int num = Integer.parseInt(br.readLine()); //학생 수
		arr = new int[num+1];
		result = new int[num+1];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=1; i<=num; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		result[1] = 1;
		for(int i=2; i<=num; i++) {
			if(arr[i] == 0) result[i] = i;
			else { //앞으로 이동
				//앞으로 가야 하는 위치
				int go = i-arr[i];
				for(int j=i-1; j>=go; j--) { //앞으로 들어갈 번호부터 뒤로 한칸씩 
					result[j+1] = result[j];
				}
				result[go] = i;
			}
		}
		
		for(int i=1; i<=num; i++) System.out.print(result[i]+" ");
	}
}

카테고리:

업데이트: