본문 바로가기
알고리즘/SWEA

SWEA D3 19185. 육십갑자 (python)

by 개발하는 호랑이 2024. 1. 30.

육십갑자

풀이

흔히 아는 10 간과 12지를 결합하는 방식과 관련한 코드를 짜는 문제이다.
육 십간 자는 60년마다 회갑이 있기에 이를 기반으로 최소공배수를 구하여서 풀었다.

  1. N, M 의 최소공배수 구하기
  2. gapja라는 리스트를 만들고 그 안에 회갑까지 가능한 모든 수를 넣기.
  3. 이제 찾으려는 년도에 % 연산자를 이용해서 gapja [인덱스]에 넣어서 구현
# 유클리드 호제법을 이용한 최소공배수 구하기
# 최소공약수
def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a
# 최소공배수
def lcm(a, b):
    return a * b // gcd(a, b)

T = int(input())
for testcase in range(1, T+1):
    N, M = map(int, input().split())
    LCM = lcm(N,M)                              # N, M의 최소공배수 구하기
    s_list = list(map(str, input().split()))
    t_list = list(map(str, input().split()))
    # 최소공배수만큼 리스트 짜주기
    gapja = []
    for i in range(LCM):
        gapja.append(s_list[i % N] + t_list[i % M])
    # 찾으려는 연도 계산하기
    answer = []
    Q = int(input())
    for _ in range(Q):
        what_year = int(input())
        answer.append(gapja[what_year % LCM -1])
    ans = ' '.join(answer)
    print(f'#{testcase} {ans}')