https://www.acmicpc.net/problem/3052
백준 3052번 문제는 위 링크에서 확인해볼 수 있다!
입력
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
출력
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
글을 왜 쓰느냐하면, BufferedReader와 BufferedWriter를 사용할 때 내가 겪은 오류를 공유하고자 글을 쓴다.
❌ bw.write(count); ⭕ bw.write(String.valueOf(count));
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));
boolean[] remainder = new boolean[42]; // 나머지 값을 저장할 boolean 배열
int count = 0;
for (int i = 0; i < 10; i++) {
int t = Integer.parseInt(br.readLine()) % 42; // 나머지 계산
if (!remainder[t]) { // 해당 나머지가 처음 등장하면
remainder[t] = true; // 나머지 기록
count++; // 카운트 증가
}
}
// bw.write(count);
bw.write(String.valueOf(count));
bw.flush();
}
}
일단 나는 처음에 주석으로 처리된 코드로 작성을 했다.
당연히 결과는 "틀렸습니다!!!"
그래서 찾아봤다.
❌ bw.write(count);의 이유 및 해결 방법
BufferedWriter의 write 메서드가 문자열 형식의 데이터를 요구하기 때문에 틀린 것!
count는 정수형 int 타입이기 때문에, 이를 직접 write 메서드에 전달하면 오류가 발생한다는 것이었다.
BufferedWriter.write 메서드는 내부적으로 문자열 데이터를 출력하도록 설계되어있다.
그럼 어떻게 해결하느냐?
정수 데이터를 출력하려면 이를 문자열로 변환해야 한다. 그 코드가 아래 적었던 코드이다.
bw.write(String.valueOf(count));
❔ 왜 bw.write(count);가 안 되는지 더 자세히
BufferedWriter.write(int)는 char를 출력하기 위해 설계된 메서드이다.
예를 들어, bw.write(65);는 문자 A를 출력한다. (ASCII 코드 65에 해당하는 문자)
count 값이 정수 10이라면, 이것을 bw.write(10)로 전달하면 ASCII 코드 10 (\n, 줄바꿈 문자)로 해석되므로 원하는 결과가 출력되지 않는다.
그러고 나서 다른 사람들은 어떻게 해결했나 하고 찾아봤더니 내가 너무 어렵게 생각했었나 보다 !
쉬운 Hash도 있었고, 굳이 BufferedWriter를 쓸 필요도 없었던 것이다.
그 해결방법도 공유하려고 한다.
✅ BufferedWriter 사용하지 않고 System.out.println을 이용하여 출력
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean[] remainder = new boolean[42]; // 나머지 값을 저장할 boolean 배열
int count = 0;
for (int i = 0; i < 10; i++) {
int t = Integer.parseInt(br.readLine()) % 42; // 나머지 계산
if (!remainder[t]) { // 해당 나머지가 처음 등장하면
remainder[t] = true; // 나머지 기록
count++; // 카운트 증가
}
}
System.out.println(count);
}
}
✅ HashMap 이용
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashSet<Integer> h = new HashSet<Integer>();
for (int i = 0; i < 10; i++) {
h.add(Integer.parseInt(br.readLine()) % 42);
}
System.out.print(h.size());
}
}
- HashSet.add() 메소드는 HashSet에 저장하는 메소드이다. 처음 생성할 때 HashSet<Integer> 으로 타입을 Integer로 선언했기 때문에 int 형 또는 Integer 객체를 넣어주어야한다.
- 또한 이 메소드에서 값을 넣을 때 만약 중복되는 값이 없으면 HashSet 에 저장되면서 True 를 반환하고, 만약 중복되어 저장되지 않으면 False 를 반환한다.
- 또한 HashSet.size() 는 HashSet 의 크기(= 저장되어 있는 원소의 개수)를 반환한다.
위 두가지의 방법을 이용하면 조금 더 쉽게 풀 수 있으니 참고하면 좋을 것 같다!
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] 최빈값 구하기 - JAVA (0) | 2024.11.24 |
---|---|
[HackerRank] No Prefix Set (4) | 2024.11.12 |
[HackerRank] Tree: Huffman Decoding (18) | 2024.11.11 |
[HackerRank] Tree: Preorder Traversal (8) | 2024.11.11 |
[HackerRank] Breadth First Search: Shortest Reach (2) | 2024.11.10 |