올해는 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 문을 없애버리고 최종 출력을 하나로 합쳤습니다. 과거 내가 태어난 년도 또는 미래의 년도가 육십갑자로 표현했을 때 어떤 갑자가 나오는지 알아보았습니다.
코드가 대단히 복잡하지 않아 쉽게 이해하셨을 거라 생각이 듭니다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
[파이썬 GUI] tkinter 7 화면 전환~~ (Frame을 이용한 화면 전환) (0) | 2022.11.24 |
---|---|
[파이썬 GUI] tkinter 6(특정 키를 누를 때 동작하는 bind함수/로그인 창 음영 넣는 법) (0) | 2022.10.28 |
[파이썬 GUI] tkinter 5(입력 위젯 만들기) (2) | 2022.10.26 |
[파이썬 GUI] tkinter 4(버튼 사용하기/버튼의 기능 만들기) (3) | 2022.10.21 |
[파이썬 GUI] tkinter 3(위젯을 화면에 배치하는 방법, pack, grid, place) (0) | 2022.10.14 |
댓글