algorithm

[SWEA 19185번 육십갑자]

선호하는 2024. 7. 5. 17:00

※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


육십갑자 체계를 일반화한 다음과 같은 상황을 생각해 보자. N개의 문자열 s1, s2, s3 …, sN 과 M개의 문자열 t1, t2, t3, , tM 이 있다. 이들은 알파벳 소문자로만 이루어져 있다. 1년은 두 문자열 s1, t1 을 이어붙인 이름을 가지고, 그 다음 해는 각각의 문자열 리스트에서 다음 순서에 해당되는 문자열을 이어붙인 이름을 가진다. 만약 리스트에서 다음 순서가 없다면, 첫 원소로 돌아간다.

예를 들어, N = 3, M = 4, s = {“a”, “b”, “c”}, t = {“d”, “e”, “f”, “g”} 라고 하면 매년 아래 표처럼 이름이 붙여진다. 일반적인 육십갑자 체계는 N = 10, M = 12 를 만족한다.



두 문자열 리스트와 Q개의 질문이 주어진다각 질문으로 이름을 알고 싶은 년도의 숫자가 주어질 때그 이름을 반환하라.

[입력]
첫 번째 줄에 테스트 케이스의 수 TC가 주어진다. 이후 TC개의 테스트 케이스가 새 줄로 구분되어 주어진다. 각 테스트 케이스는 다음과 같이 구성되었다.
 - 첫 번째 줄에는 각 문자열 리스트의 길이 N, M 이 주어진다. (1 ≤ N,M≤20)
 - 다음 줄에는 N개의 문자열 
s1, s2, ssN 이 주어진다.
 - 다음 줄에는 M개의 문자열
 t1, t2, t3, , tM 이 주어진다.
 - 다음 줄에는 정수 Q 가 주어진다.(1≤Q≤2020)

 - 다음 Q개의 줄에는 이름을 알고 싶은 년도 Y가 주어진다.(1≤Y≤10^9)
 - 주어지는 문자열들은 알파벳 소문자로만 이루어져 있고 그 길이가 10을 넘지 않는다.

[출력]
각 테스트 케이스 마다 한 줄씩, 이름에 해당하는 Q개의 문자열을 입력 순서대로 출력하라.

 

 

<문제풀이>

N과 M을 입력받고, split으로 리스트로 만든 후, 연도를 입력받고 규칙에 맞게 출력하면 되는 문제이다.처음엔 가능한 조합을 미리 만들고 나머지 값으로 출력하려 했는데, 생각해 보니 N*M을 미리 구해두는 것보다 따로 계산하는 게 더 빠를 것 같아 두 번에 걸쳐 나누기를 진행했다.

해당 년도가 0인 경우에 예외처리를 한 이유는, 0으로는 나눌 수 없기 때문이다.

 

<소스코드>

T = int(input())
for tc in range(1, T + 1):
    print(f'#{tc}', end=' ')
    N, M = map(int, input().split())
    N_list = list(input().split())
    M_list = list(input().split())
    for _ in range(int(input())):
        year = int(input()) - 1
        if year == 0:
            print(f'{N_list[0]}{M_list[0]}', end=' ')
        else:
            print(f'{N_list[year % N]}{M_list[year % M]}', end=' ')
    print()