
난이도: ★★★☆☆ • solved on: 2025-07-20

자료구조
int[][]) 또는 HashMap<Integer, Integer>알고리즘/기법
핵심 키워드
if 기반)
- 문제 분해
- x와 y 각각에 대해 세 점 중 유일하게 한 번만 등장한 값이 네 번째 점의 좌표이다.
- 핵심 로직 흐름
- axis[0] → x좌표 배열 - axis[1] → y좌표 배열 - 각 좌표 배열에서, 같은 값이 2번 나오면 그 값은 생략 - 나머지 한 번만 나온 값을 추출
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line;
int[][] axis = new int[2][3];
int[] answer = new int[2];
for (int i = 0; i < 3; i++) {
line = br.readLine().split(" ");
axis[0][i] = Integer.parseInt(line[0]); // x
axis[1][i] = Integer.parseInt(line[1]); // y
}
for (int i = 0; i < 2; i++) {
int[] tmp = {0, 0};
for (int j = 0; j < 3; j++) {
if (j == 0) {
tmp[0] = axis[i][j];
} else {
if (tmp[1] == 0 && axis[i][j] != tmp[0]) {
tmp[1] = axis[i][j];
if (j == 2) answer[i] = tmp[1];
} else if (axis[i][j] == tmp[0] && tmp[1] != 0) {
answer[i] = tmp[1];
} else if (axis[i][j] == tmp[1]) {
answer[i] = tmp[0];
}
}
}
}
System.out.println(answer[0] + " " + answer[1]);
}
}
- 각 좌표의 빈도를
Map에 저장한 뒤, 빈도 1인 값을 출력
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Map<Integer, Integer> xMap = new HashMap<>();
Map<Integer, Integer> yMap = new HashMap<>();
for (int i = 0; i < 3; i++) {
String[] input = br.readLine().split(" ");
int x = Integer.parseInt(input[0]);
int y = Integer.parseInt(input[1]);
xMap.put(x, xMap.getOrDefault(x, 0) + 1);
yMap.put(y, yMap.getOrDefault(y, 0) + 1);
}
int x = 0, y = 0;
for (int key : xMap.keySet()) {
if (xMap.get(key) == 1) {
x = key;
break;
}
}
for (int key : yMap.keySet()) {
if (yMap.get(key) == 1) {
y = key;
break;
}
}
System.out.println(x + " " + y);
}
}
- XOR은 같은 값이 두 번 나오면 0이 되므로, 세 점을 XOR하면 남는 하나의 값이 바로 답
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = 0, y = 0;
for (int i = 0; i < 3; i++) {
x ^= sc.nextInt();
y ^= sc.nextInt();
}
System.out.println(x + " " + y);
}
}
방법 1
- 시간 복잡도: O(1)
- 공간 복잡도: O(1)
방법 2
- 시간 복잡도: O(1)
- 공간 복잡도: O(1) (
Map크기는 최대 3)
방법 3 (XOR)
- 시간 복잡도: O(1)
- 공간 복잡도: O(1)
Set, Map, XOR을 고려해보자.getOrDefault()는 Map을 쓸 때 빈도 수 카운팅에 매우 유용하다.XOR은 짝수 번 등장한 숫자를 제거하고 홀수 번 등장한 숫자만 남기는 데 특화되었기에. 이 문제처럼 “두 번 등장한 것을 제거하고 하나만 남기고 싶은” 상황에 적합하다.방법2와 방법3에서 사용된 메소드 및 연산자
방법 2:
HashMap을 사용한 개수 세기
메소드 / 구문 설명 map.getOrDefault(key, defaultValue)key가 존재하면 해당 값을 반환, 없으면 기본값 반환 map.put(key, value)key에 해당하는 값을 삽입하거나 덮어씀 map.keySet()현재 저장된 모든 key 값을 반환
방법 3:
XOR연산을 사용한 좌표 추출
연산자 / 구문 설명 ^(XOR)비트 단위 배타적 논리합: 같은 값이면 0, 다르면 1 x ^= valuex에 value를 XOR한 결과를 다시 x에 저장
^)의 활용1. XOR 의 정의
XOR (Exclusive OR) 연산은 두 값이 서로 다를 때만 1, 같으면 0을 반환하는 비트 연산
진리표 (Truth table)
A B A ^ B 0 0 0 0 1 1 1 0 1 1 1 0 "서로 다르면 1, 같으면 0"
예제 1: 정수의 XOR 연산
: 정수는 내부적으로 2진수(비트)로 표현된다.
int a = 5; // 0101 (2진수) int b = 3; // 0011 int result = a ^ b; // 0101 ^ 0011 = 0110 → 10진수로 6
예제 2:
x ^= value가 의미하는 것:
x에x와 value의 XOR 연산 결과를 다시 저장한다.
실제 활용된 원리
입력:
1 4 3 4 1 10x좌표:
1,3,1
y좌표:4,4,10x좌표에서
1이 두 번,3이 한 번 등장하므로
1 ^ 3 ^ 1 = (1 ^ 1) ^ 3 = 0 ^ 3 = 3
따라서 정답 x는3y좌표에서
4 ^ 4 ^ 10 = 0 ^ 10 = 10같은 값이 두 번 XOR 되면 사라진다(0이 된다)는 성질을 이용한 것.
XOR 연산의 특징 요약
특징 설명 A ^ A = 0 같은 값을 두 번 XOR 하면 0이 된다 A ^ 0 = A 0과 XOR 하면 자기 자신이 된다 결합법칙, 교환법칙 가능 순서와 묶음이 바뀌어도 결과는 같음 활용 짝수 번 등장한 값 제거, 유일한 값 찾기
비슷한 유형 (GPT 추천):
확장 문제 (GPT 추천):