[JAVA] 백준 10810. 공 넣기

이 글은 읽는데 약 5분이 걸립니다.

※개인 공부 목적의 정리글입니다.
이 글의 내용이 최선의 해답은 아닐 수 있습니다.

문제

403 Forbidden

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.

도현이는 앞으로 M번 공을 넣으려고 한다. 도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 공을 넣을 바구니는 연속되어 있어야 한다.

공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다는 뜻이다. 예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는 뜻이다. (1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ N)

도현이는 입력으로 주어진 순서대로 공을 넣는다.

출력

1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.

요약

언뜻 보기에는 문제가 복잡해보이지만 이해하면 쉽다. 배열을 이용하면 쉽게 풀 수 있다.

먼저 전체 바구니의 개수 N을 준다. 이것이 배열의 길이이다. 배열의 한 칸이 바구니 하나라고 생각하자.

M은 공을 넣는 행동의 횟수이다. 즉, 다음 줄부터 나오는 이동 지시 부분이 몇 개인지를 뜻한다.

이제 한 줄에 숫자 3개가 나오며, 총 M줄 나오게된다.
각 숫자를 i, j, k라 하면 i번 바구니~j번 바구니의 숫자를 k로 교체하라는 뜻이다.

나의 코드

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 = new StringTokenizer(br.readLine());
        
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        
        int[] buckets = new int[N];
        
        for(int x=0; x<M; x++){
            st = new StringTokenizer(br.readLine());
            int i = Integer.parseInt(st.nextToken());
            int j = Integer.parseInt(st.nextToken());
            int k = Integer.parseInt(st.nextToken());
            
            for(int idx=i; idx<=j; idx++){
                buckets[idx-1] = k;
            }
        }
        
        for(int num : buckets){
            System.out.print(num + " ");
        }
        
        br.close();
    }

}

먼저 N과 M을 받은 후 buckets라는 길이 N인 int 배열을 선언했다. 배열은 0으로 초기화 되므로 우리가 다시 초기화 할 필요가 없다.

이후 공 옮기기를 M번 반복한다. i, j, k를 추출한다. 이 후 i번~j번 바구니의 값을 k로 바꾼다.
이 때, idx-1을 해주는 이유는 바구니 번호는 1부터 시작하지만 배열은 0부터 시작하므로 바구니 번호에서 1을 뺀 값이 실제 배열 상에서 바구니의 위치이기 때문이다.

이후에는 그냥 배열을 출력해주면 된다.

댓글