본문 바로가기
프로그래밍/파이썬

육십갑자를 파이썬으로 알아보자!(올해는 계묘년 : 검은 토끼의 해)

by 인성패밀리 2023. 1. 5.
반응형

올해는 2023년 계묘년입니다.

 

그렇다면 자신이 태어난 년도에 무엇으로 불렸는지 알고 계신가요?

 

육십갑자는 "갑을병정무기경신임계"라 하는 천간 10개와 "자축인묘진사오미신유술해"라 하는 지지12개를 하나 씩 번갈아가면서 붙인 것을 육십갑자라 합니다.

 

올해는 천간 10개 중 계에 해당하고 지지 12개 중 묘에 해당합니다.

 

육십갑자를 만드는 원리는 

   

 가장 첫 번째는 '갑'과 '자'를 합쳐서 갑자년 이라 합니다. 이런 식으로 갑자년의 다음 해는 '을'과 '축'을 합쳐 을축년, 그 다음 해는 병인년 -> 정묘년 -> 무진년 -> ,,, 이렇게 계속 돌아갑니다.

 

하나 씩 하다보면 계유년에서 계 다음이 갑으로 순환하는 구조입니다. 때문에 계유년 다음은 갑술년이 됩니다.

 

그렇다면 얼만큼 시간이 흘러야 다시 갑자년이 될까요?

수학에서 최소 공배수를 활용하면 알 수 있습니다.

 

10과 12의 최소 공배수를 구하면 되는데 

10은 20 -> 30 -> 40 -> 50 -> 60 -> 70

12는 24 -> 36 -> 48 -> 60

쉽게 60이라는 점을 알 수 있습니다.

 

때문에 자신이 갑자년에 태어나 60년이 흘러 다시 갑자년이 되었을 때 이를 "환갑"이라 옛날에는 환갑 잔치를 크게 하기도 했습니다.

 

우리는 이제 이를 파이썬 코드로 알아보려고 합니다.

 

원하는 년도를 입력했을 때 해당 년도의 육십갑자를 출력하도록 해보겠습니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

우선 천간과 지지를 리스트에 담습니다. first에서 앞 글자 second에서 뒷 글자를 조합할 것입니다.

 

이제 현재년도와 무슨 갑자인지 표기할 예정입니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

year = 2023
sexagenary_cycle = "계묘년"

이제 계묘년에 해당하는 인덱스 번호를 찾아야 합니다. 인덱스 번호를 손으로 써도 되지만 귀찮아서 코드로 작성하겠습니다.

index 메소드를 사용하면 리스트 안의 인덱스 번호를 알 수 있습니다.

 

이제 원하는 년도를 입력합니다. 이후 현재 년도보다 앞에 있으면 인덱스 번호를 하나 씩 더하면서 찾고 과거의 갑자를 알고 싶으면 인덱스 번호를 하나 씩 빼야합니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

year = 2023
sexagenary_cycle = "계묘년"

first_index = first.index(sexagenary_cycle[0])  # 첫 번째 글자 인덱스 번호
second_index = second.index(sexagenary_cycle[1])  # 두 번째 글자 인덱스 번호

print("원하는 년도의 육십갑자를 구하는 프로그램입니다.")
find_year = int(input("찾고 싶은 년도를 적으시오: "))

if year < find_year:
    # 인덱스 번호를 하나 씩 늘리면서 찾기
elif year > find_year:
    # 인덱스 번호를 하나 씩 줄이면서 찾기
else:
    # 같은 경우이므로 그냥 현재 값 출력하기
    print("올해는 계묘년입니다.")

 

만약에 2024를 입력하면 딱 한 번 반복을 해야합니다.

즉 원하는 년도와 찾는 년도의 차를 구하면 됩니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

year = 2023
sexagenary_cycle = "계묘년"

first_index = first.index(sexagenary_cycle[0])  # 첫 번째 글자 인덱스 번호
second_index = second.index(sexagenary_cycle[1])  # 두 번째 글자 인덱스 번호

print("원하는 년도의 육십갑자를 구하는 프로그램입니다.")
find_year = int(input("찾고 싶은 년도를 적으시오: "))

if year < find_year:
    # 인덱스 번호를 하나 씩 늘리면서 찾기
    for i in range(find_year - year):
        # 반복할 코드
elif year > find_year:
    # 인덱스 번호를 하나 씩 줄이면서 찾기
    for i in range(year - find_year):
        # 반복할 코드
else:
    # 같은 경우이므로 그냥 현재 값 출력하기
    print("올해는 계묘년입니다.")

얼만큼 반복할 지 알았으니 무엇을 반복해야 할 지 정해야 합니다.

반복 할 코드는 첫 번째 조건에서는 first_index와 second_index의 값을 각각 1씩 더하면 됩니다.

두 번째 조건은 1씩 빼야하는 코드가 들어가야 합니다.

 

그러나 만약 2230년을 입력할 경우 2230 - 2023을 하면 207번 반복을 하는데 그러면 1을 207번 더해야 합니다. 이러면 인덱스 번호를 제대로 찾을 수 없으니까

 

더할 경우 천간에 해당하는 first_index 변수는 값이 10이 되면 다시 0으로 초기화 하고 

지지에 해당하는 second_index는 값이 12가 되면 다시 0으로 초기화 합니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

year = 2023
sexagenary_cycle = "계묘년"

first_index = first.index(sexagenary_cycle[0])  # 첫 번째 글자 인덱스 번호
second_index = second.index(sexagenary_cycle[1])  # 두 번째 글자 인덱스 번호

print("원하는 년도의 육십갑자를 구하는 프로그램입니다.")
find_year = int(input("찾고 싶은 년도를 적으시오: "))

if year < find_year:
    # 인덱스 번호를 하나 씩 늘리면서 찾기
    for i in range(find_year - year):
        first_index += 1
        second_index += 1
        if first_index == 10:  # 만약 10이 된다면
            first_index = 0  # 다시 초기화
        if second_index == 12:  # 만약 12가 된다면
            second_index = 0  # 다시 초기화
elif year > find_year:
    # 인덱스 번호를 하나 씩 줄이면서 찾기
    for i in range(year - find_year):
        # 빼기의 경우 반대로 생각해야합니다.
        first_index -= 1
        second_index -= 1
        if first_index == -1:
            first_index = 9
        if second_index == -1:
            second_index = 11
else:
    # 같은 경우이므로 그냥 현재 값 출력하기
    print("올해는 계묘년입니다.")

반복문이 끝났다 라는 말은 다 찾았다를 의미합니다.

원하는 것을 모두 찾았으면 조합하는 일만 남았습니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

year = 2023
sexagenary_cycle = "계묘년"

first_index = first.index(sexagenary_cycle[0])  # 첫 번째 글자 인덱스 번호
second_index = second.index(sexagenary_cycle[1])  # 두 번째 글자 인덱스 번호

print("원하는 년도의 육십갑자를 구하는 프로그램입니다.")
find_year = int(input("찾고 싶은 년도를 적으시오: "))

if year < find_year:
    # 인덱스 번호를 하나 씩 늘리면서 찾기
    for i in range(find_year - year):
        first_index += 1
        second_index += 1
        if first_index == 10:  # 만약 10이 된다면
            first_index = 0  # 다시 초기화
        if second_index == 12:  # 만약 12가 된다면
            second_index = 0  # 다시 초기화

    # 이제 글자 조합하기
    print(f"{find_year}의 육십갑자는 {first[first_index]+second[second_index]}년 입니다.")

elif year > find_year:
    # 인덱스 번호를 하나 씩 줄이면서 찾기
    for i in range(year - find_year):
        # 빼기의 경우 반대로 생각해야합니다.
        first_index -= 1
        second_index -= 1
        if first_index == -1:
            first_index = 9
        if second_index == -1:
            second_index = 11
    # 이제 글자 조합하기
    print(f"{find_year}의 육십갑자는 {first[first_index] + second[second_index]}년 입니다.")
else:
    # 같은 경우이므로 그냥 현재 값 출력하기
    print("올해는 계묘년입니다.")

 

정상적으로 출력되는 것을 볼 수 있는데 약간 코드를 수정하겠습니다.

 

불편한 점이 한 가지 있는데 같은 동작을 두 번 한다는 점입니다.

조건문을 통과하면 결과값이 일정한 형태를 갖추어 출력하도록 해보겠습니다.

first = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
second = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

year = 2023
sexagenary_cycle = "계묘년"

first_index = first.index(sexagenary_cycle[0])  # 첫 번째 글자 인덱스 번호
second_index = second.index(sexagenary_cycle[1])  # 두 번째 글자 인덱스 번호

print("원하는 년도의 육십갑자를 구하는 프로그램입니다.")
find_year = int(input("찾고 싶은 년도를 적으시오: "))

if year < find_year:
    # 인덱스 번호를 하나 씩 늘리면서 찾기
    for i in range(find_year - year):
        first_index += 1
        second_index += 1
        if first_index == 10:  # 만약 10이 된다면
            first_index = 0  # 다시 초기화
        if second_index == 12:  # 만약 12가 된다면
            second_index = 0  # 다시 초기화
elif year > find_year:
    # 인덱스 번호를 하나 씩 줄이면서 찾기
    for i in range(year - find_year):
        # 빼기의 경우 반대로 생각해야합니다.
        first_index -= 1
        second_index -= 1
        if first_index == -1:
            first_index = 9
        if second_index == -1:
            second_index = 11
            
# 이제 글자 조합하기
print(f"{find_year}의 육십갑자는 {first[first_index] + second[second_index]}년 입니다.")

else 문을 없애버리고 최종 출력을 하나로 합쳤습니다. 과거 내가 태어난 년도 또는 미래의 년도가 육십갑자로 표현했을 때 어떤 갑자가 나오는지 알아보았습니다. 

 

코드가 대단히 복잡하지 않아 쉽게 이해하셨을 거라 생각이 듭니다.

반응형

댓글