[백준/JAVA] - 공 넣기(10810번)
👉 공 넣기 - 10810 https://www.acmicpc.net/problem/10810
공 넣기 - 10810

https://www.acmicpc.net/problem/10810
문제를 처음 읽었을 때는 무슨 말 인지 잘 이해되지 않았다.
문제를 메모장에 적으며 천천히 여러 번 다시 읽어보고 이해를 했다.
정리를 하면 이렇다.
조건 1 : 한 시도마다 공은 한 번 밖에 못 넣는다.
조건 2: 공이 이미 있으면 새 공으로 교체한다.
INPUT
N, M (N : 바구니의 수, 공의 최대 번호, M : 시도 횟수)
입력 i j k : **(i번부터 **j번 바구니까지 번호 k라고 적혀있는 공을 넣기)

OUTPUT
바구니 안에 있는 공의 번호 출력
바구니1 바구니2 바구니3 … 바구니N

예제 입력으로 이해를 해보자!!
바구니 5개, 공 5개를 가지고 4번 시도한다.
숫자는 바구니 안의 공의 번호를 나타낸다. (비었을 경우 0)
0 0 0 0 0 (바구니 초기 상태)
3 3 0 0 0 (첫 번째 시도)
3 3 4 4 0 (두 번째 시도)
1 1 1 1 0 (세 번째 시도)
1 2 1 1 0 (네 번째 시도, 결과)
자, 이제 여기까지 봤으면 어떻게 풀어야 할지 감이 올 것이다.
배열을 이용해서 풀면 된다!!
Java (Scanner)
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//입력
int n = sc.nextInt();
int m = sc.nextInt();
//바구니를 배열로 설정, 바구니 갯수 설정
int[] basket = new int[n];
for (int i = 0; i < m; i++) { //a, b, c (문제상 i,j,k) 입력받기
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
for (int j = a - 1; j < b; j++) { //a부터 b까지 바구니에 공c 넣기
basket[j] = c;
}
}
//출력
for(int i = 0; i < n; i++){
System.out.print(basket[i] + " ");
}
}
}
바구니의 개수가 N개이니, 크기가 N인 정수 배열을 선언해주면 된다.
자바에서 정수 배열의 기본 값은 0이기 때문에 따로 건드릴 필요가 없다.
시도 횟수 M만큼 for문을 통해 돌려주고,
a부터 b번 바구니 까지 c번이라 적힌 공을 넣으면 된다.
여기서 주의 할 점이 있는데 문제에서는 1번 바구니부터 시작하는데, 실제 배열은 0번부터 시작한다.
이를 신경 써주면서 코드를 짜줘야 한다.

for 문의 시작 값을 a - 1로 한다. (배열은 0번부터 시작하기 때문)
목표 값을 b 미만으로 한다. ( j <= b-1로 해줘도 된다.)
그리고 해당 배열의 값을 C로 한다.
그리고 출력 양식에 맞게 출력해주면 끝!!
-
Java (BufferedReader + StringTokenizer)
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[] basket = new int[n];
for (int i = 0; i < m; i++) { //a, b, c (문제상 i,j,k) 입력받기
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
for (int j = a - 1; j < b; j++) { //a부터 b까지 바구니에 공c 넣기
basket[j] = c;
}
}
//출력
for(int i = 0; i < n; i++){
System.out.print(basket[i] + " ");
}
}
}
a b c 를 여러 번 입력 받아야 하기 때문에
StringTokenizer의 객체를 다시 생성해줘야 한다.
안 해주면 NoSuchElementException이라는 오류가 난다.
가져올 요소가 없다는 것이다.
이전에 이미 N M 이나, a b c에서 토큰(“ “)을 사용해서 더 가져올 토큰이 남아있지 않기 때문이다.
그래서 nextToken()을 여러 번 써야 할 때면 꼭 객체를 다시 생성해줘야 한다.

제출 번호 67963604 - BufferedReader + StringTokenizer (144ms)
제출 번호 67943602 - Scanner (260ms)
속도 차이가 꽤 많이 난다…😮
![]()
끝!
댓글남기기