728x90

 

문제 : 14681번: 사분면 고르기 (acmicpc.net)

 

14681번: 사분면 고르기

점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

www.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("잘못 입력 되어있습니다");
        }

    }
}

 

 

 

 

728x90
반응형
728x90

 

문제 : 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 (acmicpc.net)

 

3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰

첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다.

www.acmicpc.net

 

 

큰 틀에서의 로직은

갖춰야할 장기말의 수 - 입력 받은 수

           A                      -             B

 

즉 A-B를 각각 배열로 만들어서 for문을 돌려 인덱스번호 별로 호출하여 각 번호를 빼주는 것이다

answer = A[i] - B[i]

 

갖춰야할 장기말의 수 : 변수명 horse

int[] horse = {1,1,2,2,2,8};

입력받은 수 : 변수명 st

StringTokenizer st = new StringTokenizer(br.readLine(), " ");

 

 

st를 변수명 temp에 배열로 집어넣는다 

for(int i=0; i<horse.length;i++){
    temp[i] = Integer.parseInt(st.nextToken());

 

각각을 배열로 만들어서 for문을 배열길이 총6만큼 반복 시켜서 

for문의 i인덱스번호만큼 각 지정 숫자끼리 빼는 것이다

그리고 마지막 출력을 공백 있는 정수나 str로 해야 하기에 배열로 그대로 출력하면 틀리니 주의

(필자가 이래서 틀림처림됨)

        for(int i=0; i<horse.length;i++){
            temp[i] = Integer.parseInt(st.nextToken());
            answer += horse[i] - temp[i] + " ";
        }

 

 

정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
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[] horse = {1,1,2,2,2,8};
        int[] temp = new int[6];
        String answer = "";

        for(int i=0; i<horse.length;i++){
            temp[i] = Integer.parseInt(st.nextToken());
            answer += horse[i] - temp[i] + " ";
        }
        System.out.println(answer);

    }
}
728x90
반응형

+ Recent posts