본문 바로가기

알고리즘

백준 알고리즘 문제 풀이 가이드: 코딩 면접 대비 완벽 준비-9613 GCD 합 편 (python)

728x90
반응형

문제 살펴보기!!

문제 링크 : https://www.acmicpc.net/problem/9613


반응형

솔루션 살펴보기!!

import sys
import math
from itertools import combinations  # 가능한 모든 쌍을 생성하기 위해 사용

def main():
    input = sys.stdin.read  # 표준 입력을 한 번에 읽어옴
    data = input().split()  # 데이터를 공백 기준으로 분할하여 리스트로 저장
    idx = 0
    t = int(data[idx])  # 첫 번째 값은 테스트 케이스의 수
    idx += 1
    
    for _ in range(t):  # 테스트 케이스의 수만큼 반복
        n = int(data[idx])  # 현재 테스트 케이스에서 배열의 크기
        idx += 1
        numbers = list(map(int, data[idx:idx+n]))  # n개의 숫자를 리스트로 변환
        idx += n  # 인덱스를 숫자 수만큼 증가시킴
        
        # combinations를 사용하여 모든 숫자 쌍에 대해 GCD를 계산하고 합을 구함
        total_gcd = sum(math.gcd(a, b) for a, b in combinations(numbers, 2))
        
        # 결과 출력
        print(total_gcd)

if __name__ == "__main__":
    main()

풀이 전략

이 문제는 여러 테스트 케이스에 대해 주어진 배열에서 가능한 모든 숫자 쌍의 **최대공약수(GCD)**의 합을 구하는 문제입니다. 이를 해결하기 위한 전략은 다음과 같습니다.

1. 입력 처리

우리는 여러 테스트 케이스가 주어지므로, 각 테스트 케이스에 대해 처리해야 합니다. 각 테스트 케이스는 다음과 같은 정보를 포함합니다:

  • 첫 번째 숫자 n은 배열의 크기를 나타냅니다.
  • 그 다음에 n개의 숫자가 주어집니다.

2. 쌍의 조합 생성

문제는 배열에 있는 모든 숫자 쌍에 대해 GCD를 계산한 후, 그 결과를 합산해야 합니다.

  • 이를 위해 우리는 이중 반복문을 사용하거나 **itertools.combinations**를 사용하여 배열의 모든 숫자 쌍을 구할 수 있습니다.
    • 예를 들어, 배열이 [1, 2, 3]이라면 가능한 숫자 쌍은 (1, 2), (1, 3), (2, 3)입니다.
    • 여기서 가능한 모든 숫자 쌍을 생성하고, 각 쌍에 대해 GCD를 계산해야 합니다.

3. 최대공약수(GCD) 계산

각 숫자 쌍 (a, b)에 대해 **최대공약수(GCD)**를 계산합니다.

  • 파이썬의 math.gcd() 함수를 사용하여 두 숫자의 최대공약수를 쉽게 계산할 수 있습니다.
  • 각 쌍에 대해 GCD를 계산한 후 그 값을 모두 더해줍니다.

4. 결과 출력

각 테스트 케이스마다 구한 GCD의 합을 출력합니다.

알고리즘 흐름 요약

  1. 입력 읽기: 주어진 입력을 모두 읽어서 각 테스트 케이스에 대한 정보를 처리합니다.
  2. 숫자 쌍 구하기: 배열 내의 모든 숫자 쌍을 생성합니다. 이는 combinations(numbers, 2)로 해결됩니다.
  3. GCD 계산 및 합산: 각 쌍의 GCD를 계산하고 이를 모두 더합니다.
  4. 출력: 테스트 케이스마다 구한 GCD의 합을 출력합니다.

세부 단계

  1. 입력 처리:
    • 입력으로 여러 테스트 케이스가 주어지며, 각 테스트 케이스는 첫 번째로 배열의 크기 n과 이어서 n개의 정수가 주어집니다.
    • 입력은 한꺼번에 sys.stdin.read로 읽은 뒤, 공백 기준으로 분할하여 리스트 형태로 처리합니다.
  2. 모든 쌍에 대한 GCD 계산:
    • 배열에서 두 개의 숫자를 선택하여 그 숫자들의 GCD를 계산합니다. 이때 가능한 모든 쌍을 선택하는 방법으로 **조합(combinations)**을 사용합니다.
    • itertools.combinations(numbers, 2)를 사용하면 가능한 모든 두 숫자 쌍을 순차적으로 가져올 수 있습니다.
  3. 최대공약수(GCD) 계산:
    • 각 쌍의 GCD는 파이썬 내장 함수인 math.gcd()로 쉽게 계산할 수 있습니다.
    • math.gcd(a, b)는 두 숫자 a, b의 최대공약수를 반환합니다.
  4. 결과 합산:
    • 각 쌍의 GCD를 구한 후, 이를 모두 더하여 최종 결과로 출력합니다.

시간 복잡도 분석

  1. 조합 계산:
    • 각 테스트 케이스에서 숫자 n개로부터 가능한 모든 두 숫자의 조합을 구하는데, 이는 **O(n^2)**의 시간이 걸립니다. 조합을 구하는 방법 자체는 효율적이나, 두 숫자의 GCD를 매번 계산해야 하기 때문에 이중 반복문과 같은 시간 복잡도를 가집니다.
  2. GCD 계산:
    • 두 숫자 a, b에 대해 GCD를 계산하는 데 드는 시간은 **O(log(min(a, b)))**입니다. 즉, 두 숫자의 크기에 따라 계산 시간이 달라질 수 있습니다.

코드 면접시 알아야할 주요 개념!!

1. 최대공약수(GCD)

  • 개념: 두 정수의 공통된 약수 중 가장 큰 값을 구하는 것.
  • 사용된 함수: math.gcd(a, b)는 두 숫자 a, b의 최대공약수를 계산합니다.
  • 유클리드 호제법: math.gcd 함수는 유클리드 호제법을 사용합니다. 이는 두 숫자의 GCD를 구할 때, 큰 숫자를 작은 숫자로 나눈 나머지를 이용하여 점진적으로 값을 좁히는 방법으로, 시간 복잡도는 **O(log(min(a, b)))**입니다.
  • 면접에서 중요성: 유클리드 호제법은 효율적인 알고리즘으로 면접에서 자주 다뤄지는 주제입니다. 특히 수학적인 문제나 최적화 문제에서 종종 등장합니다.

2. 조합(Combinations)

  • 개념: 조합은 주어진 집합에서 순서를 고려하지 않고 두 개 이상의 항목을 선택하는 방법을 말합니다.
  • 사용된 함수: itertools.combinations(numbers, 2)는 주어진 리스트 numbers에서 가능한 모든 2개 쌍을 생성합니다.
  • 시간 복잡도: combinations(numbers, 2)의 시간 복잡도는 **O(n^2)**입니다. 이는 n개의 숫자에서 가능한 두 숫자 쌍을 생성하는데 필요한 시간입니다.
  • 면접에서 중요성: 조합 문제는 데이터 집합에서 가능한 선택지를 구할 때 필수적인 개념이며, 특히 조합 최적화 문제부분집합 문제에서 자주 등장합니다.

3. 시간 복잡도 분석

  • 개념: 코드의 성능을 분석할 때, 입력 크기에 따른 시간 복잡도를 파악하는 것이 중요합니다.
  • 시간 복잡도 설명:
    • 테스트 케이스 수: t
    • 각 테스트 케이스에서 숫자 쌍의 조합을 구하는 복잡도는 O(n^2) (combinations 사용).
    • 각 쌍의 GCD를 계산하는 복잡도는 O(log(min(a, b))) (유클리드 호제법 사용).
    • 따라서, 전체 시간 복잡도는 **O(t * n^2 * log(max(a, b)))**로 나타낼 수 있습니다.
  • 면접에서 중요성: 면접에서는 문제 해결뿐만 아니라 효율성에 대한 고려가 필수입니다. 이 문제처럼 시간 복잡도를 정확히 계산하고, 최적화가 필요한 부분을 찾아내는 것이 중요합니다.

4. 리스트(Lists)와 리스트 슬라이싱

  • 개념: 리스트는 파이썬의 기본 자료 구조로, 값을 순차적으로 저장합니다. 코드에서는 data[idx:idx+n]을 통해 리스트의 특정 구간을 슬라이싱하여 원하는 부분을 가져오고 있습니다.
  • 리스트 슬라이싱: 리스트에서 data[start:end]는 리스트의 start부터 end-1까지의 요소를 가져옵니다. 이를 통해 배열의 부분을 손쉽게 추출할 수 있습니다.
  • 면접에서 중요성: 리스트와 관련된 다양한 조작(슬라이싱, 추가, 삭제 등)은 면접에서 매우 빈번하게 등장합니다. 이를 효율적으로 다룰 줄 아는 능력은 필수적입니다.

5. 파이썬 내장 함수 및 모듈

  • itertools: 조합, 순열 등의 문제를 처리하기 위해 사용되는 모듈입니다. 면접에서는 종종 조합, 순열, 반복 등의 문제 해결을 위해 이 모듈을 사용할 수 있는지 물어봅니다.
  • math.gcd: 유클리드 호제법을 활용한 GCD 계산을 위한 함수입니다.
  • sys.stdin.read: 표준 입력을 한꺼번에 받아 처리하는 방식입니다. 특히 많은 양의 데이터를 처리할 때 유용합니다.
  • 면접에서 중요성: 파이썬의 내장 함수와 모듈을 적절히 사용하는 능력은 문제 해결 속도를 높일 수 있으며, 파이썬의 장점을 최대한 활용하는 방법을 면접관에게 보여줄 수 있습니다.

6. 알고리즘 문제 해결 과정

  • 문제 분해 및 해결 전략: 주어진 문제를 여러 단계로 나누고 각 단계에서 효율적인 방법을 찾아내는 과정은 면접에서 핵심적인 능력입니다. 이 코드에서는 문제를 단계별로 나눠 입력 처리, 조합 생성, GCD 계산, 결과 출력이라는 흐름으로 해결합니다.
  • 면접에서 중요성: 문제를 잘게 나누고 각 단계에서 적절한 방법을 선택하는 것은 문제 해결 능력의 중요한 요소입니다.

7. 효율적인 입력 처리

  • 개념: 파이썬에서 표준 입력을 처리하는 여러 가지 방법 중, sys.stdin.read는 한 번에 많은 입력을 받아 처리할 때 유용합니다.
  • 면접에서 중요성: 알고리즘 문제에서는 대규모 입력을 다루는 것이 일반적이므로, 입력을 효율적으로 처리하는 방법을 이해하는 것이 중요합니다.

 

728x90
반응형