on
백준 3009번 문제풀이 - 네 번째 점
백준 3009번 문제풀이 - 네 번째 점
백준 3009번 문제
https://www.acmicpc.net/problem/3009
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위한 네 번째 좌표를 출력하면 된다. 주어진 x좌표 3개 중 다른 값 하나를 출력하고 y좌표도 동일하게 출력하면 된다. 이를 알고리즘을 만들고 코딩하면 되는 쉬운 문제이다.
코딩
1. 나의 풀이 StringTokenizer를 사용하면 입력 받음.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Dpoint { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int[] coord1 = {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())}; // 1번 좌표 st = new StringTokenizer(br.readLine()); int[] coord2 = {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())}; // 2번 좌표 st = new StringTokenizer(br.readLine()); int[] coord3 = {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())}; // 3번 좌표 int[] coord4 = new int[2]; // 출력되는 4번 좌표 // x좌표 if (coord1[0] == coord2[0]) { // 1번 x좌표와 2번 x좌표가 같으면 3번 x좌표 출력 coord4[0] = coord3[0]; } else if (coord1[0] != coord3[0]) { // 1과 2 좌표가 다르고 3과도 다르면 1번 좌표 출력 coord4[0] = coord1[0]; } else { // 1과 2가 다르고 3번과 같으면 2번 좌표 출력 coord4[0] = coord2[0]; } // y좌표 if (coord1[1] == coord2[1]) { // x좌표와 동일 coord4[1] = coord3[1]; } else if (coord1[1] != coord3[1]) { coord4[1] = coord1[1]; } else { coord4[1] = coord2[1]; } System.out.println(coord4[0] + " " + coord4[1]); } }
2. 입력을 split()로 받은 풀이
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Dpoint2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] c1 = br.readLine().split(" "); String[] c2 = br.readLine().split(" "); String[] c3 = br.readLine().split(" "); String x; String y; // x좌표 if (c1[0].equals(c2[0])) { x = c3[0]; } else if (c1[0].equals(c3[0])) { x = c2[0]; } else { x = c1[0]; } // y좌표 if (c1[1].equals(c2[1])) { y = c3[1]; } else if (c1[1].equals(c3[1])) { y = c2[1]; } else { y = c1[1]; } System.out.println(x + " " + y); } }
결과
1.
2.
split()을 사용해서 입력을 받았을 때 약간 더 빠른 것을 볼 수 있다.
느낀 점
알고리즘을 짜는 데 어려움이 없어서 풀기 쉬웠다. 입력을 어떻게 받아야 될 지에 대한 공부를 좀 더 할 수 있었고 문자열 비교를 할 때 ==를 사용하면 안 된다는 것을 배웠다.
첫 번째 풀이에서는 정수형으로 받았기 때문에 ==을 사용해도 상관없었지만 두 번째 풀이에서 String형을 받아서 ==로 비교했을 때 문제가 발생했다. 문제 해결을 위해 구글링을 하다 보니 ==는 객체가 같은 지를 비교하지만 객체가 갖고 있는 문자열을 비교하지는 않는다는 것을 알게 되었다. 이를 확인하는 메서드로 System.identityHashCode()가 있다.
첫 번째 x좌표와 두 번째 x좌표가 5, 5로 문자열이 같지만 HashCode는 다른 것을 볼 수 있고 서로 다른 객체라는 것을 알 수 있다.
from http://chobojonghyun.tistory.com/21 by ccl(A) rewrite - 2021-11-23 20:01:35