문제 이름 : 공 넣기
문제
도현이는 바구니를 총 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
을 출력한다.
예제 입력 1
5 4
1 2 3
3 4 4
1 4 1
2 2 2
예제 출력 1
1 2 1 1 0
이 문제를 해석하기로 결정한 이유는,
문제 설명이 난해하지만, 요약해서 구현할 내용은 간단하기 때문이다.
요약해서 구현 할 내용에 대한 부분을 직접 테이블로 보여주면 더 이해하기 쉽다.
1. 도현이는 바구니는 총 N 개를 가지고 있다.
도현이는 특정 번호의 공을 넣을 배열의 길이를 N
개를 가지고 있다.
2. 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.
바구니는 특정 요소를 아직 포함하고 있지 않으며(Default : 0),
바구니가 담을 수 있는 정보는 1개 로 한정되어 있다.
3. 도현이는 앞으로 M 번 공을 넣으려고 한다.
영역을 지정하여 공을 연속하여 넣는 행위를 M
번 반복한다.
4. 만약 바구니에 공이 이미 있는 경우에는 공을 빼고, 새로 공을 넣는다.
연속된 바구니는 하나의 정보만을 담을 수 있으며,
연속된 바구니는 int
배열을 의미하며, 하나의 배열에는 하나의 정수만을 저장할 수 있다.
따라서, 새로운 정보가 들어왔을 때, 기존의 정보를 무시하고 새로운 공 번호 를 넣는다.
5. 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.
M
번의 줄을 통해 어떤 영역에 어떤 공 번호를 넣을지 계산 한 후,
최종적으로 바구니 내부에 담겨있는 정보를 순차적으로 출력한다.
위에서 정리한 정보와, 예제 입력, 출력을 보고 테이블을 구성 해 보자.
5 4
1 2 3
3 4 4
1 4 1
2 2 2
바구니의 개수(N
) 는 5개이며,
바구니에 공을 넣을 횟수(M
) 이 4로 주어진다.
이를 시각화하여 편하게 이해하기 위해, 테이블로 구성해보자.
아직 바구니에 공이 들어가지 않았을 때
1번 | 2번 | 3번 | 4번 | 5번 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 2 3
입력됨
1번에서 3번까지 2 번 공을 넣는다.
1번 | 2번 | 3번 | 4번 | 5번 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
2 | 2 | 2 |
3 4 4
입력됨
3번에서 4번까지 4 번 공을 넣는다.
1번 | 2번 | 3번 | 4번 | 5번 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
2 | 2 | 2 | ||
4 | 4 |
1 4 1
1번에서 4번까지 1 번 공을 넣는다.
1번 | 2번 | 3번 | 4번 | 5번 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
2 | 2 | 2 | ||
4 | 4 | |||
1 | 1 | 1 | 1 |
2 2 2
2번에서 2번까지 2 번 공을 넣는다.
1번 | 2번 | 3번 | 4번 | 5번 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
2 | 2 | 2 | ||
4 | 4 | |||
1 | 1 | 1 | 1 | |
2 |
Result - 입력의 결과
1 | 2 | 1 | 1 | 0 |
---|
정답 출력과 동일한 것을 확인 할 수 있다.
이를 코드로 나타 내 보자.
N
,M
을 받는다.M
횟수만큼 공을 넣는다.- 바구니에 들어있는 공을 출력한다.
이 과정에서, 한 가지 메서드를 분리 해 보자.
바로, 바구니 인덱스 2 개와 공의 번호 1개 파라미터를 받는 메서드로 분리하자.
그리고, 해당 메서드에서 배열의 값을 바꾸는 것이다.
Answer
import java.util.*;
import java.io.*;
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[] arr = new int[N]; // 바구니의 개수 N
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int ballNumber = Integer.parseInt(st.nextToken());
insert(arr, start, end, ballNumber);
}
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
// 공을 넣는 기능을 관심사에서 분리.
public static void insert(int[] arr, int start, int end, int ballNumber){
for(int i = start - 1; i < end; i++)
arr[i] = ballNumber;
}
}
'백준-단계별로 풀어보기 > 4-1차원 배열' 카테고리의 다른 글
백준 10811 - 바구니 뒤집기 (0) | 2024.09.06 |
---|---|
백준 3052 - 나머지 (0) | 2024.09.05 |
백준 10818 - 최소, 최대 (0) | 2024.08.28 |
백준 10807 - 개수 세기 (1) | 2024.08.27 |