문제 : 14681번: 사분면 고르기 (acmicpc.net)
※ 해설과 정답은 아래
풀이과정
찻줄 정수x 다음줄 정수y주어진다고 해서 StringTokenizer로 받으면 오답처리 될지도 모름
오답 처리시, BufferedReader 2개로 받아보자
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(),",");
int x = 0;
int y = 0;
while(st.hasMoreTokens()){
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
}
System.out.println(x);
System.out.println(y);
if( x > 0 && y > 0){
System.out.print(1);
}else if(x < 0 && y > 0){
System.out.print(2);
}else if( x < 0 && y < 0){
System.out.print(3);
}else if(x > 0 && y < 0){
System.out.print(4);
}else{
System.out.print("잘못 입력 되어있습니다");
}
인텔리제이에서 돌리면 작동 잘하는데 백준에서 런타임 에러 (NoSuchElement) 발생
아마도 다른 입력 경우의수가 잘못된게 아닌가 싶다
BufferedReader 2개 받아 시도
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br1.readLine());
int y = Integer.parseInt(br2.readLine());
if( x > 0 && y > 0){
System.out.print(1);
}else if(x < 0 && y > 0){
System.out.print(2);
}else if( x < 0 && y < 0){
System.out.print(3);
}else if(x > 0 && y < 0){
System.out.print(4);
}else{
System.out.print("잘못 입력 되어있습니다");
}
이번에는 런타임 에러(NumberFormat) 발생
런타임에러 : 배열의 크기를 잘못지정하거나 함수가 끝나지 않을 시 발생
라고 하는데 배열도 없고 배열로 반환하는 메소드도 없고, 함수도 다 잘 마무리 되었다
뭐가 문제일까?
0 입력 방지 + else의 에러메시지가 str이므로 제거 해보자
x,y쪽 br 받는 부분만 for 돌려서 0 안받는 방법?
if( x > 0 && y > 0 && x!=0 && y!=0){
System.out.print(1);
}else if(x < 0 && y > 0 && x!=0 && y!=0){
System.out.print(2);
}else if( x < 0 && y < 0 && x!=0 && y!=0){
System.out.print(3);
}else if(x > 0 && y < 0 && x!=0 && y!=0){
System.out.print(4);
}else{
System.out.print("잘못 입력 되어있습니다");
}
int x = 0;
int y = 0;
for(int i=1; i <=2; i++) {
if(x!=0 && y!=0) {
x = Integer.parseInt(br1.readLine());
y = Integer.parseInt(br2.readLine());
}
}
위의 둘을 적용해도 런타임 에러(NumberFormat) 발생
뭐가 문제일까...?
첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)
-> 백준에서 이런 조건이 주어지면 테스트 시, 해당 수의 범위만 테스트한다는 의미
즉, 0입력을 코드에서 고려할 필요없고, 다른게 문제라는 의미
BufferedReader 2개로 각각 x,y로 받았을 때 런타임에러(NumberFormat) 발생한 이유
백준에서는 파일 형식으로 받는데(IDE에서의 작동방식과 다르다는 의미)
스트림으로 데이터를 받을 때, BufferedReader 2개로 각각 받으면 IDE랑 다르게
파일형식이라 첫줄에 br1이 값을 받아 x로 넘기고 br1 값은 지워지고 br2 받을 때 둘째줄로 넘어가는게 아닌
첫줄에서 시작하고 또한 공백값을 받기에 br2가 공백을 받아 NumberFormat이 발생한 것
br을 두개에서 하나로 줄여서 문제 해결
해설
- 양수 구분 : 0초과 ex) x > 0
- 음수 구분 : 0미만 ex) x < 0
BufferedReader생성하여 값을 입력 받고
br.readLine()으로 x,y 각각 값을 입력 받는다
AND(&&)로 x,y의 각각 조건인 양수,음수들을 if문 조건에 넣고
x,y가 각각 양수면 1분면 식으로 조건을 줘도 뽑아내면 된다
이때 주의할 점은
첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)
라는 조건이 백준에서 주어지면 코드에서는 저 범위와 0에 대해서는 신경 안써도 된다. 즉, 테스트할 때 해당 숫자의 조건만 테스트를 돌리기 때문에 0이 들어오는 경우의 수도 신경 안써도 됐었음
정답
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br1.readLine());
int y = Integer.parseInt(br1.readLine());
if( x > 0 && y > 0){
System.out.print(1);
}else if(x < 0 && y > 0){
System.out.print(2);
}else if( x < 0 && y < 0){
System.out.print(3);
}else if(x > 0 && y < 0){
System.out.print(4);
}else{
System.out.print("잘못 입력 되어있습니다");
}
}
}
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 입력, 출력값도 같은 값이고 로직도 맞는 것 같은데 틀리다고 나온다면...? (0) | 2022.11.11 |
---|---|
[코딩테스트][백준] Step2-5 2884번 : 알람 시계 (0) | 2022.11.11 |
[코딩테스트][백준] Step2-3 2753번 : 윤년 (1) | 2022.09.30 |
[코딩테스트][백준] Step1-10 3003번 : 킹, 퀸, 룩, 비숍, 나이트, 폰(feat.약간 다른 로직) (0) | 2022.09.29 |
[코딩테스트][백준] Step2-1 1330번 : 두 수 비교하기(feat.BufferedReader+StringTokenizer) (1) | 2022.09.29 |