문제
도현이는 바구니를 총 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을 출력한다.
입력 | 출력 |
5 4
1 2 3
3 4 4
1 4 1
2 2 2 | 1 2 1 1 0 |
❔ 문제 간단 설명
각각의 바구니는 1 ~ n까지 번호가 새겨진 바구니가 존재할 것이다.
각각의 바구니는 1개의 공을 넣을 수 있다.
도현이는 1 ~ n까지 번호가 새겨진 공을 무수히 가지고 있다.
n은 바구니 갯수, m은 공을 넣을 횟수
i, j는 i번 바구니부터 j번 바구니까지
k는 k번의 공을 넣을 것
답
◽Scanner
import java.util.Scanner;
public class ScannerJava {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 배열의 크기
int n = sc.nextInt();
int[] arr = new int[n];
// for문 횟수
int m = sc.nextInt();
for (int c = 0; c < m; c++) {
int i = sc.nextInt();
int j = sc.nextInt();
int k = sc.nextInt();
for (int a = i; a <= j; a++) {
arr[a - 1] = k;
}
}
// for문 돌며 배열 값 추출
for (int ball : arr) {
System.out.print(ball + " ");
}
sc.close();
}
}
◽ BufferedReader / BufferedWriter
import java.io.*;
public 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));
// 한 줄 입력 시, 공백을 기준으로 입력 값 배열로 담기
String[] firstLine = br.readLine().split(" ");
// n -> [1, 2, 3, 4, ....., n]
int n = Integer.parseInt(firstLine[0]);
// m -> for문 횟수
int m = Integer.parseInt(firstLine[1]);
int[] arr = new int[n];
for (int c = 0; c < m; c++) {
String[] secondLine = br.readLine().split(" ");
// i, j -> 변경할 배열의 위치(배열의 idx + 1 *idx는 0부터 시작)
int i = Integer.parseInt(secondLine[0]);
int j = Integer.parseInt(secondLine[1]);
// k -> 변경할 값
int k = Integer.parseInt(secondLine[2]);
for (int a = i; a <= j; a++) {
arr[a - 1] = k;
}
}
// for문 돌면서 배열 값 추출
for (int ball : arr) {
bw.write(ball + " ");
}
br.close();
bw.flush();
bw.close();
}
}
풀이
◽ String[] firstLine = br.readLine().split(" ");
입력을 살펴보면 첫째 줄에 N,M이 입력되고, 둘째 줄에 i, j, k가 입력된다.
1개 씩 읽는 Scanner와 다르게 1줄을 읽는 BufferdReader는 공백(” “)을 기준으로 String[] 배열에 담아서 각 원하는 값을 추출한다.
◽ bw.write(ball + " ");
BufferdWriter는 정수를 읽을 때, 그 자체를 읽지 않고 아스키코드 속 해당 정수 번호로 출력한다.
그렇기 때문에 정수를 문자열로 변환하여 출력해야 원하는 값을 출력할 수 있다.
int n = 97;
bw.write(n); // "a"
String nStr = String.valueOf(n); // "97"
bw.write(nStr); // "97"

하지만 bw.write(ball + “ “)은 왜 문자열로 변환할 필요가 없을까?
Java는 ‘+’ 연산자가 피연산자 중 하나라도 문자열일 경우, 문자열 결합을 수행한다.
그래서 정수인 ball은 문자열 ball로 자동 변환된다.
결과적으로 ball + “ “은 write에서 문자열이 전달된다.Share article