문제설명
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 답변>
이 코드에는 몇 가지 오류가 있습니다. 아래에 주요 문제점과 수정 방안을 설명하겠습니다:
- sc.nextInt()와 sc.nextLine()의 혼용 문제:
- sc.nextInt()는 숫자 입력을 받지만, 그 다음 sc.nextLine()을 바로 호출하면 빈 문자열을 반환하게 됩니다. 이는 nextInt() 호출 후에 남아있는 개행 문자(\n)를 읽기 때문입니다.
- 해결 방법: sc.nextInt() 이후에 sc.nextLine()을 호출하여 버퍼를 비워야 합니다.
- System.out.print(y);에서 y 변수가 정의되지 않음:
- y는 for-loop 내에서만 정의된 지역 변수입니다. for-loop 외부에서는 사용할 수 없습니다.
- 해결 방법: System.out.print(minY);로 수정하여 최소값을 출력해야 합니다.
- 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를 출력할 때 배열 값 출력하는 걸 몰라서 답답했는데, 딱 필요한 정보를 알려줘서 좋았음.
반응형
'JAVA > 코딩테스트' 카테고리의 다른 글
Softeer 연습문제(JAVA) Level 1. 나무 심기 (0) | 2024.10.22 |
---|---|
Softeer 연습문제(JAVA) Level 1. 연탄 배달의 시작 (0) | 2024.10.21 |
Softeer 연습문제(JAVA) Level 1. [한양대 HCPC 2023] 개표 (0) | 2024.10.21 |
Softeer 연습문제(JAVA) Level 1. 주행거리 비교하기 (0) | 2024.10.21 |
Softeer 연습문제(JAVA) Level 1. 근무시간 (0) | 2024.10.21 |
댓글