Stay Hungry Stay Foolish

SWEA

[SWEA] 19185. 육십갑자 (Python/D3)

dev스카이 2024. 11. 3. 21:01

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


풀이

 

💡입력받은 Q 를 N과 M의 길이로 나눈다.

 

순환 구조

  • 리스트 s는 길이가 N이고, 리스트 t는 길이가 M이므로, s와 t의 요소들은 순환하면서 사용된다.
  • 예를 들어, 리스트 s에 "a", "b", "c"가 있고, 리스트 t에 "d", "e", "f", "g"가 있다면,
    • 첫 번째 이름은 s[0] + t[0] = "ad",
    • 두 번째 이름은 s[1] + t[1] = "be",
    • 세 번째 이름은 s[2] + t[2] = "cf",
    • 네 번째 이름은 다시 s[0] + t[3] = "ag"로 돌아간다.

 

주기적 접근과 나머지 연산

  • q % Nq % M을 이용하면, q번째 요소를 N과 M의 길이 내에서 반복적으로 순환하도록 만들 수 있다.
  • 리스트의 인덱스는 0부터 시작하므로, q - 1로 조정한 뒤 N과 M으로 나눈 나머지를 구해 인덱스를 얻어낸다
    • 예를 들어, Y = 5일 때 s의 인덱스는 (Y - 1) % N = 4 % N이 된다.
    • 이를 통해 s와 t 리스트의 요소들이 순환되며, N번째 이후에는 다시 첫 번째 요소로 돌아간다.

 

코드에서 q % N - 1

  • 이 표현은 리스트의 인덱스가 0부터 시작하기 때문에 필요한 조정이다.
  • 예를 들어, Y = 1이라면, (1 - 1) % N = 0이 되어 s와 t 리스트의 첫 번째 요소가 결합되어야 하므로 q - 1을 통해 0부터 시작하는 인덱스를 맞춘다.

 

따라서, q % N과 q % M을 사용하여 년도 Y에 해당하는 이름을 주기적으로 구할 수 있다.

 

Solution

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    N, M = map(int, input().split())
    n = input().split()
    m = input().split()
    Q = int(input())
    result = []
    
    # 육십갑자 계산
    for _ in range(Q):
        q = int(input())
        result.append(n[q % N - 1] + m[q % M - 1])
        
    print(f"#{test_case} {' '.join(result)}")