스위프트 코딩테스트 강좌, ‘좋은 수’ 구하기

서브리마리 코딩테스트에서는 자주 “좋은 수”를 찾는 문제들이 출제됩니다. 이번 강좌에서는 “좋은 수”라고 불리는 특정 조건을 만족하는 수를 구하는 문제를 해결해 보겠습니다. 이 과정은 스위프트 언어를 사용하는 경우에 어떻게 문제를 접근하고 해결하는지를 잘 보여줄 것입니다.

문제 설명

문제는 다음과 같습니다:

주어진 자연수 N에 대해, 친구가 좋은 수를 정의했습니다. 즉, 1부터 N까지의 수 중에서 어떤 두 수 x, y의 합이 N이 되는 경우, x와 y는 좋은 수로 간주됩니다. 당신은 주어진 N에 대해 좋은 수의 쌍을 찾고, 좋은 수를 출력해야 합니다. 단, x는 y보다 작거나 같아야 하며, x + y = N을 만족해야 합니다.

입력 형식

  • 첫 번째 줄에 자연수 N (1 ≤ N ≤ 1000)이 주어집니다.

출력 형식

  • 좋은 수의 모든 쌍 (x, y)를 한 줄에 하나씩 출력합니다.

문제 접근

좋은 수를 구하기 위해 우리는 다음과 같은 접근 방식을 사용할 수 있습니다:

  1. 두 개의 반복문을 사용하여 1부터 N까지의 모든 가능한 쌍을 생성합니다.
  2. 각 쌍의 합이 N인지 확인합니다.
  3. 합이 N인 쌍을 출력합니다.

알고리즘 구현

스위프트에서는 다음과 같은 구조로 문제를 해결할 수 있습니다:

import Foundation

func findGoodNumbers(N: Int) {
    var goodPairs: [(Int, Int)] = []
    
    for x in 1...N {
        for y in x...N {
            if x + y == N {
                goodPairs.append((x, y))
            }
        }
    }
    
    // 결과 출력
    for pair in goodPairs {
        print("좋은 수의 쌍: \(pair.0), \(pair.1)")
    }
}

let N = 10 // 예제 입력
findGoodNumbers(N: N)

코드 설명

위의 스위프트 코드에서는 다음과 같은 중요한 세부사항을 볼 수 있습니다:

  1. 함수 findGoodNumbers는 자연수 N을 매개변수로 받아 그에 대한 좋은 수의 쌍을 찾습니다.
  2. 이중 for 루프를 사용하여 xy의 모든 쌍을 생성합니다.
  3. 합이 N과 같은 경우, 그 쌍을 goodPairs 배열에 추가합니다.
  4. 마지막으로, 배열에 저장된 좋은 수의 쌍들을 출력합니다.

실행 결과

입력 N이 10일 경우, 프로그램은 다음과 같은 출력을 생성합니다:

좋은 수의 쌍: 1, 9
좋은 수의 쌍: 2, 8
좋은 수의 쌍: 3, 7
좋은 수의 쌍: 4, 6
좋은 수의 쌍: 5, 5

복잡도 분석

이 알고리즘의 시간 복잡도는 O(N^2)입니다. N에 대해 이중 루프를 사용하기 때문에, 큰 N 값에 대해 실행 시간이 증가할 수 있습니다. 그러나 N의 최대 값이 1000으로 제한되어 있으므로 이 정도의 시간 복잡도는 실제로 실용적입니다.

결론

이번 글에서는 ‘좋은 수’ 문제를 해결하기 위한 접근 방식과 스위프트 코드로 그 해결책을 구현해 보았습니다. 간단하면서도 효과적인 이중 반복문을 통해 문제를 해결하는 방법을 배웠습니다. 앞으로도 이와 같은 문제를 통해 알고리즘적 사고를 발전시키는데 도움이 되길 바랍니다.

추가 고민거리

이 문제를 해결하는 다양한 방법을 고민해볼 수 있습니다. 예를 들어:

  • 해시맵을 사용하여 O(N) 시간 복잡도로 좋은 수를 찾는 방법
  • N이 짝수일 때, x의 범위를 N/2까지만 두는 것
  • 재귀적 방법을 통한 해결 방안

이와 같은 다양한 접근 방식을 통해 알고리즘에 대한 깊이 있는 이해를 할 수 있습니다. 다음 강좌에서는 이와 관련된 추가 문제를 다룰 예정입니다. 감사합니다!