📌 문제 개요
백준 2359 문제는 입력으로 주어지는 좌표 값들을 활용하여 x좌표와 y좌표 각각이 2개 이상 등장하는 경우를 찾아 그 합을 출력하는 문제입니다.
- 입력: 한 줄에 공백으로 구분된 정수 2개 (x y)가 여러 줄 입력됩니다.
- 출력: x좌표에서 2개 이상 중복된 값의 개수와 y좌표에서 2개 이상 중복된 값의 개수를 더한 값을 출력합니다.
문제 링크: 백준 2359
📝 알고리즘 & 접근 방식
문제 해결을 위한 전체적인 접근법은 다음과 같습니다:
- 입력 처리:
- readLine()을 사용하여 입력을 받고, EOF(End Of File) 또는 nil을 만날 때까지 반복합니다.
- 각 입력 줄을 공백 기준으로 분리한 뒤, 정수 변환합니다.
- 좌표 빈도수 계산:
- x좌표와 y좌표 별로 별도의 딕셔너리(xNodes, yNodes)를 사용합니다.
- 딕셔너리의 default value 기능을 활용하여 좌표 값이 처음 등장할 때 자동으로 0으로 초기화하고, 값이 등장할 때마다 카운트를 증가시킵니다.
- 필터링 및 결과 도출:
- filter 메서드를 이용하여, 등장 횟수가 2 이상인 키의 개수를 구합니다.
- x좌표와 y좌표 각각의 조건을 만족하는 개수를 합산하여 출력합니다.
💻 코드 분석
아래는 코드의 주요 부분에 대한 해설입니다:
_ = readLine()
var xNodes: [Int: Int] = [:]
var yNodes: [Int: Int] = [:]
while let input = readLine() {
let splitted = input.split(separator: " ").compactMap({ Int(String($0)) })
let x = splitted[0]
let y = splitted[1]
xNodes[x, default: 0] += 1
yNodes[y, default: 0] += 1
}
let xMatches = xNodes.filter({ $0.value >= 2 }).count
let yMatches = yNodes.filter({ $0.value >= 2 }).count
print(xMatches+yMatches)
주요 포인트
- while let 구문:
입력 종료 시까지 반복적으로 처리할 수 있는 안전한 옵셔널 바인딩 방식입니다. - compactMap:
입력된 문자열을 정수형으로 변환하며, 변환이 실패할 경우 nil을 제거해 깨끗한 배열을 생성합니다. - Dictionary의 default 값:
xNodes[x, default: 0] += 1 처럼 사용하면 키가 처음 등장할 때 자동으로 0으로 초기화되어 간결하게 작성할 수 있습니다. - filter와 count:
조건에 맞는 원소만 걸러내어 개수를 계산하는 방식으로, 코드가 직관적으로 이해할 수 있습니다.
반응형
'알고리즘' 카테고리의 다른 글
| 백준 25757번 문제 풀이 (0) | 2025.04.16 |
|---|---|
| leetcode 187. Repeated DNA Sequences (0) | 2025.04.15 |
| leetcode 706. Design HashMap (0) | 2025.04.10 |
| leetcode 2283. Check if Number Has Equal Digit Count and Digit Value 문제 풀이 (0) | 2025.04.09 |
| 백준 3986번 문제 풀이 (0) | 2025.04.08 |