알고리즘

백준 2358번 평행선 문제 풀이

kimhyeji 2025. 4. 14. 03:49

📌 문제 개요

백준 2359 문제는 입력으로 주어지는 좌표 값들을 활용하여 x좌표와 y좌표 각각이 2개 이상 등장하는 경우를 찾아 그 합을 출력하는 문제입니다.

  • 입력: 한 줄에 공백으로 구분된 정수 2개 (x y)가 여러 줄 입력됩니다.
  • 출력: x좌표에서 2개 이상 중복된 값의 개수와 y좌표에서 2개 이상 중복된 값의 개수를 더한 값을 출력합니다.

문제 링크: 백준 2359


📝 알고리즘 & 접근 방식

문제 해결을 위한 전체적인 접근법은 다음과 같습니다:

  1. 입력 처리:
    • readLine()을 사용하여 입력을 받고, EOF(End Of File) 또는 nil을 만날 때까지 반복합니다.
    • 각 입력 줄을 공백 기준으로 분리한 뒤, 정수 변환합니다.
  2. 좌표 빈도수 계산:
    • x좌표와 y좌표 별로 별도의 딕셔너리(xNodes, yNodes)를 사용합니다.
    • 딕셔너리의 default value 기능을 활용하여 좌표 값이 처음 등장할 때 자동으로 0으로 초기화하고, 값이 등장할 때마다 카운트를 증가시킵니다.
  3. 필터링 및 결과 도출:
    • 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:
    조건에 맞는 원소만 걸러내어 개수를 계산하는 방식으로, 코드가 직관적으로 이해할 수 있습니다.
반응형