2 minute read




문제 풀이


공 넣기문제는 정해진 배열에 값을 넣기만 하면 되는 간단한 문제이다.

아이디어 도출

N개의 바구니에 M번만큼 공을 집어 넣을 수 있고, 연속된 바구니에 같은 번호가 적힌 공을 집어넣어야 한다.
예제 테스트케이스처럼 N개의 바구니가 준비되어 있고, i부터 j번째 바구니까지 k번호가 적힌 공을 M번만큼 집어넣으면 된다.
이 솔루션을 1차원 배열로 풀어내면 된다.

  • N개의 길이를 가지는 배열을 준비한다.
  • M번 횟수만큼 배열에 값을 설정한다.
    • 배열의 (i-1)번째부터 (j-1)번째 인덱스까지 순회하면서 k 값을 삽입하면 된다.
    • 바구니는 1번째 부터 시작하지만 배열의 인덱스는 0부터 시작하기 때문이다.

이제 코드를 작성해보자.


1
2
3
4
5
StringTokenizer st = new StringTokenizer(br.readLine());

int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];

먼저 StringTokenizer를 통해 공백 기준으로 N과 M을 입력받고 N개의 크기를 가지는 정수 배열을 초기화하자.


1
2
3
4
5
6
7
8
9
10
11
12
for(int idx=0; idx<M; idx++) {
    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 r=i-1; r<j; r++) {
        arr[r] = k;
    }
}
for(int ball : arr) {
    bw.write(ball + " ");
}

다음으로는 실제로 M번 횟수만큼 공을 집어넣는 로직을 구현한 내용은 다음과 같다.

  1. i j k 형식으로 입력이 들어오기 때문에 StringTokenizer로 공백 기준으로 i와 j, k라는 값을 변수에 저장한다.
  2. 중첩 for문을 통해 arr 배열에 (i-1)번째 인덱스부터 (j-1)번째 인덱스까지 k 값을 삽입한다.
  3. arr 배열에 담긴 원소들을 공백으로 구분하여 한줄로 출력하면 된다.



작성코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

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

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];
        
        for(int idx=0; idx<M; idx++) {
            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 r=i-1; r<j; r++) {
                arr[r] = k;
            }
        }
        for(int ball : arr) {
            bw.write(ball + " ");
        }
               
        bw.flush();
        bw.close();
        br.close();
    }
}

회고

  • 1차원 배열에 값이 삽입될 때 기존의 값을 덮어쓰기 때문에 기존에 공이 들어간 경우 새로운 공은 넣을 수 있었다.
  • 최근 카카오 클라우드 스쿨 교육으로 인해 코딩테스트 공부를 근 2달간 이런저런 핑계로 못하고 있었는데 다시 다잡고 풀어나가려 한다.

출처

  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.