본문 바로가기
JAVA/코딩테스트

Softeer 연습문제(JAVA) Level 1. [한양대 HCPC 2023] Tren del Fin del Mundo

by Gina Sim 2024. 10. 22.

 

문제설명

Southern Fuegian Railway는 세상에서 가장 남쪽에 있는 철도이다.

 

Southern Fuegian Railway는 x축의 양의 방향을 동쪽으로 하는 2차원 좌표평면으로 나타내어진다.

 

Southern Fuegian Railway는 N개의 역과 역 사이를 잇는 N−1개의 철로로 구성되어 있다. i번째 역은 (xi,yi)에 있으며, j번째 철로는 j번 역과 j+1번 역 사이를 잇는 선분이다. (1 ≤ i ≤ N; 1 ≤ j ≤ N−1) 

 

Southern Fuegian Railway를 보러 간 선아는 세상에서 가장 남쪽에 있는 철도가 지나는 가장 남쪽 점이 어디일지 궁금해졌다.

 

제약조건

1 ≤ N ≤ 1000

|xi|, |yi| ≤ 1000

 

입력형식

첫 번째 줄에 역의 개수 N이 주어진다.

두 번째 줄부터 N개의 줄에 걸쳐서, 역의 좌표를 의미하는 두 정수 xi,yi가 공백으로 구분되어 주어진다.

두 역이 같은 위치에 있는 경우는 주어지지 않는다.

 

출력형식

첫 번째 줄에 Southern Fuegian Railway가 지나는 가장 남쪽에 있는 점의 x좌표와 y좌표를 공백으로 구분하여 출력한다. 이 점이 유일한 경우만 입력으로 주어진다.

 

예제

입력예제1
4 10 5 6 -3 3 2 4 2

출력예제1
6 -3


입력예제2
1 1000 -1000

출력예제2
1000 -1000

 

 

제출답안

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int cnt = sc.nextInt();
        sc.nextLine();

        int y =1000;
        int minY =1000;
        String answer="";
        
        for(int i=0; i<cnt; i++){
            String[] xy = sc.nextLine().split(" ");
            //System.out.println(Arrays.toString(xy));
            
            y = Integer.valueOf(xy[1]);
            if(y <= minY){
                minY = y;
                answer = xy[0]+ " " + xy[1];
            }
        }
        System.out.print(answer);

        sc.close();
    }
}

 

회고

  • 문제 이해
    • 뭔가 되게 어렵게 말한듯 했지만 그냥 y축 값이 가작 낮은거 구하면 되는 문제였음
    • 절대값을 이용해야 하는 거 처럼 문제 설명을 줬지만 절대값도 이용할 필요 없음
  • 새로 알게 된 것
    • scanner에서 값 입력 받으면서 바로 split 적용해서 array로 받을 수 있음
    • 예시 답변 찾아보니 BufferedReader를 많이 쓰던데, 다음에는 scanner 대신 사용해봐야겠음. 그게 더 실행 속도도 빠르다고 함.
    • scanner 값 입력받을 때 nextInt() 다음에 nextLine()을 사용하면, Int 값 받은 후 줄바뀜 된 부분이 인식되어서 공백값이 들어감. 줄바뀜 이후의 값을 입력받으려면 nextLine()을 한번 언급 한 뒤 한번 더  nextLine()을 이용해 값 입력받아야 함.
  • 에러핸들링
    • 제출예시는 답이 잘 구해졌는데, 제출하고 나서 마지막 입력값에서 에러가 났음. 
    • 한참 헤매다가 혹시나 하고 조건문에 (y < minY)를 (y <= minY)로 바꾸어줬더니 해결 됨.
    • y 값이 만약 같은 경우는 어떻게 하나 고민했었는데, 가장 마지막에 입력된 값으로 바꿔야 하나 봄.
    • 사실 가장 마지막 값으로 바꾸어야 하는건지, x값도 고려해서 x값 까지 작은걸로 해야하는건지 확실하진 않음. 하지만 가장 남쪽인것을 찾는 문제이므로 x 값의 위치는 연관 없을 것으로 추정. 또한 다른 답변들도 x값을 비교해서 푼 경우는 없으므로 x값은 신경쓰지 않았음.
  • 추가로 신경쓸 점
    • for 문 안에서 변수를 선언하면 자꾸 에러가 나는 듯 함. 값이 바뀌는 경우는 for문 밖에서 변수를 선언하는걸 습관화 해야함.

 


chatGPT 를 이용한 애러핸들링

<오류 코드>

import java.io.*;
import java.util.*;

public class Main { public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int cnt = sc.nextInt();
    int minY =1000;
    String minCoordinate = "";

    for(int i=0; i<cnt; i++){
        //String coordinate = sc.nextLine();
        String[] xy = sc.nextLine().split(" ");
        System.out.println(xy);

        int y = Integer.valueOf(xy[1]);
        if(y < minY){
            minY = y;
        }
    }
    System.out.print(y);
    sc.close();
}

 

<chatGPT 답변>

이 코드에는 몇 가지 오류가 있습니다. 아래에 주요 문제점과 수정 방안을 설명하겠습니다:

  1. sc.nextInt()와 sc.nextLine()의 혼용 문제:
    • sc.nextInt()는 숫자 입력을 받지만, 그 다음 sc.nextLine()을 바로 호출하면 빈 문자열을 반환하게 됩니다. 이는 nextInt() 호출 후에 남아있는 개행 문자(\n)를 읽기 때문입니다.
    • 해결 방법: sc.nextInt() 이후에 sc.nextLine()을 호출하여 버퍼를 비워야 합니다.
  2. System.out.print(y);에서 y 변수가 정의되지 않음:
    • y는 for-loop 내에서만 정의된 지역 변수입니다. for-loop 외부에서는 사용할 수 없습니다.
    • 해결 방법: System.out.print(minY);로 수정하여 최소값을 출력해야 합니다.
  3. System.out.println(xy);에서 배열을 출력하려고 하지만, 배열 자체를 출력하는 것이 아니라 배열의 값을 출력해야 함:
    • 배열을 출력하려면 Arrays.toString(xy)를 사용해야 합니다.

 

<수정 된 코드>

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int cnt = sc.nextInt();
        sc.nextLine();  // 버퍼 비우기

        int minY = 1000;
        String minCoordinate = "";

        for(int i = 0; i < cnt; i++){
            String[] xy = sc.nextLine().split(" ");
            System.out.println(Arrays.toString(xy));  // 배열 출력

            int y = Integer.valueOf(xy[1]);
            if(y < minY){
                minY = y;
            }
        }
        System.out.print(minY); // 최소 y값 출력

        sc.close();
    }
}

 

<회고>

  • y값을 print 하는 건 코드 수정 중에 단순한 실수였음
  • nextInt() 이후 nextLine()을 한번 더 언급하여 버퍼를 비워야 한다는건 새로 안 정보로 유용했음.
  • Array를 출력할 때 배열 값 출력하는 걸 몰라서 답답했는데, 딱 필요한 정보를 알려줘서 좋았음.
  1.  
반응형

댓글