[Java] 백준(브론즈-3) 10810번 - 공 넣기

문제 풀이
공 넣기문제는 정해진 배열에 값을 넣기만 하면 되는 간단한 문제이다.
아이디어 도출
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번 횟수만큼 공을 집어넣는 로직을 구현한 내용은 다음과 같다.
i j k
형식으로 입력이 들어오기 때문에 StringTokenizer로 공백 기준으로 i와 j, k라는 값을 변수에 저장한다.- 중첩 for문을 통해 arr 배열에 (i-1)번째 인덱스부터 (j-1)번째 인덱스까지 k 값을 삽입한다.
- 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달간 이런저런 핑계로 못하고 있었는데 다시 다잡고 풀어나가려 한다.
출처
- 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.