# 루이스 캐럴 – 특정 날짜의 요일 계산 기술 (1887)

> Clean Markdown view of GeekNews topic #15009. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15009](https://news.hada.io/topic?id=15009)
- GeekNews Markdown: [https://news.hada.io/topic/15009.md](https://news.hada.io/topic/15009.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-26T10:03:07+09:00
- Updated: 2024-05-26T10:03:07+09:00
- Original source: [futilitycloset.com](https://www.futilitycloset.com/2024/05/24/day-tripper/)
- Points: 1
- Comments: 1

## Topic Body

### 루이스 캐럴이 제안한 날짜 계산법

루이스 캐럴이 1887년 3월 31일 _Nature_에 보낸 편지:

> 다음과 같은 방법으로 주어진 날짜의 요일을 정신적으로 계산하는 방법을 발견했기에, 독자들에게 흥미를 줄 수 있을 것 같아 보냄. 나는 빠른 계산가는 아니며, 평균적으로 이러한 문제를 푸는 데 약 20초가 걸림. 따라서 빠른 계산가는 15초도 걸리지 않을 것이라 확신함.

#### 계산 방법

- 주어진 날짜를 4개의 부분으로 나눔: 세기, 년도, 월, 일.
- 다음 4가지 항목을 계산하고, 각 항목을 이전 항목의 합계에 더함. 항목이나 합계가 7을 초과하면 7로 나누고 나머지만 유지함.

##### 세기 항목

- 구식(1752년 9월 2일 이전): 18에서 뺌.
- 신식(1752년 9월 14일 이후): 4로 나누고, 3에서 나머지를 뺀 후, 나머지를 2로 곱함.
- 예: 1811년의 경우, 세기 항목은 18임.

##### 년도 항목

- 12의 배수, 나머지, 나머지의 4의 배수를 더함.

##### 월 항목

- 모음으로 시작하거나 끝나는 경우, 해당 월의 위치를 10에서 뺌. 이 값에 해당 월의 일 수를 더함.
- 예: 1월의 항목은 '0', 2월 또는 3월은 '3', 12월은 '12'.
- 최종 값: 1월 0, 2월 3, 3월 3, 4월 6, 5월 1, 6월 4, 7월 6, 8월 2, 9월 5, 10월 0, 11월 3, 12월 5.

##### 일 항목

- 해당 월의 일 수.

##### 윤년 조정

- 윤년의 1월 또는 2월인 경우, 최종 합계에서 '1'을 뺌. 합계가 '0'인 경우, 먼저 7을 더함.
- 윤년: 4로 나누어지는 해, 단 신식에서는 세기년이 4로 나누어지지 않는 경우 제외 (예: 1800년).

##### 최종 결과

- 최종 결과는 요일을 나타냄. '0'은 일요일, '1'은 월요일, 등등.

#### 예시

##### 1783년 9월 18일

- 세기 항목: 17을 4로 나누면 나머지 '1'. 3에서 1을 빼면 '2'. 2를 2로 곱하면 '4'.
- 년도 항목: 83은 6 다스와 11, 합계 17. 2를 더하면 19, 7로 나누면 '5'. 총합 9, 7로 나누면 '2'.
- 월 항목: 8월 항목은 '8에서 10을 뺀 값', 즉 '2'. 9월 항목은 '2에 3을 더한 값', 즉 '5'. 총합 7, 7로 나누면 '0'.
- 일 항목: 18은 '4'.
- 최종 결과: '목요일'.

##### 1676년 2월 23일

- 세기 항목: 16에서 18을 빼면 '2'.
- 년도 항목: 76은 6 다스와 4, 합계 10. 1을 더하면 11, 7로 나누면 '4'. 총합 '6'.
- 월 항목: 2월 항목은 '3'. 총합 9, 7로 나누면 '2'.
- 일 항목: 23은 '2'. 총합 '4'.
- 윤년 조정: '3'.
- 최종 결과: '수요일'.

(출처: Edward Wakeling, _Rediscovered Lewis Carroll Puzzles_, 1995.)

### GN⁺의 의견

- 루이스 캐럴의 날짜 계산법은 수학적 사고를 키우는 데 유용함.
- 이 방법은 컴퓨터 없이도 날짜를 계산할 수 있는 흥미로운 방법임.
- 윤년 계산과 같은 세부 사항을 이해하면 더 정확한 결과를 얻을 수 있음.
- 현대의 달력 계산과 비교해보는 것도 재미있을 것임.
- 수학적 퍼즐을 좋아하는 사람들에게는 도전적인 문제로 다가올 수 있음.

## Comments



### Comment 25602

- Author: neo
- Created: 2024-05-26T10:03:07+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40464303) 
##### 해커뉴스 댓글 모음 요약

* **사용자 A**: 이 방법은 내가 사용하는 방법과 매우 유사하며, Art Benjamin도 사용하는 방법임. 10~15초 내에 할 수 있지만 연습과 약간의 암기, 그리고 간단한 산수가 필요함. 이 기술을 익히면 매우 유용함.
  - **예시**: 2024년 5월 24일의 요일 계산
    ```plaintext
    2012년 이후 12년
    윤년 3회
    마법의 월 번호 2
    날짜 24
    합산 후 7로 나눈 나머지: 금요일
    ```

* **사용자 B**: JH Conway는 다른 기술을 사용했으며, 현재 연도의 요일을 계산할 때 더 빠르고 쉬움. 그러나 다른 연도의 "Doomsday"를 계산할 때는 어려움이 있어 기본 방법으로 돌아감.

* **사용자 C**: 1752년에 일어난 구식과 신식 날짜의 차이에 대해 읽으며 흥미로웠음. 18세기에는 영국의 법적 연도가 3월 25일에 시작되었음.

* **사용자 D**: 월 번호 계산 알고리즘을 이해하는 데 어려움을 겪고 있음. 각 월의 번호를 계산하는 방법을 설명하며, 자신의 시도와 기사에서 제시된 결과가 일치하지 않음을 지적함.

* **사용자 E**: Carroll의 알고리즘이 시간이 지나면서 진화해왔음. 최신 개선 사항을 포함한 First Sunday Doomsday Algorithm을 소개함.

* **사용자 F**: 더 간단한 방법을 설명한 블로그 글을 작성했음. 링크를 통해 자세한 내용을 확인할 수 있음.

* **사용자 G**: Art Benjamin이 TED 강연에서 이 기술을 시연하는 것을 보는 것이 매우 흥미로웠음. 그의 손 움직임을 통해 중간 계산을 추적할 수 있음.

* **사용자 H**: Lewis Carroll의 방법을 사용하여 2024년 5월 24일의 요일을 계산함.
  - **예시**: 
    ```plaintext
    세기 항목: 6
    연도 항목: 2
    월 항목: 1
    날짜 항목: 24
    총합: 금요일
    ```

* **사용자 I**: Python 코드를 사용하여 날짜의 요일을 계산하는 방법을 공유함.
  ```python
  def compute_day_of_week(date):
      day, month, year = date
      century = year // 100
      year_part = year % 100

      # 세기 항목 계산
      if year < 1752 or (year == 1752 and (month < 9 or (month == 9 and day < 14))):
          century_item = (18 - century) % 7
      else:
          century_item = ((3 - (century % 4)) * 2) % 7
      
      # 연도 항목 계산
      year_item = (year_part + (year_part // 4)) % 7
      
      # 월 항목 계산
      month_items = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]
      month_item = month_items[month - 1]
      
      # 날짜 항목 계산
      day_item = day % 7
      
      # 총합
      total = (century_item + year_item + month_item + day_item) % 7
      
      # 윤년 보정
      if month <= 2 and (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)):
          total = (total - 1 + 7) % 7
      
      return total

  def day_of_week_string(day_index):
      days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
      return days[day_index]

  # 날짜 입력 받기
  date_input = input("Enter a date (yyyy-mm-dd): ")
  year, month, day = map(int, date_input.split('-'))
  date = (day, month, year)

  # 요일 계산 및 출력
  day_index = compute_day_of_week(date)
  day_name = day_of_week_string(day_index)
  print(f"The day of the week for {date_input} is {day_name}.")
  ```

* **사용자 J**: 수학에서 표기법이 얼마나 중요한지 강조함. 표기법이 수학과 컴퓨터 과학에서 매우 중요한 요소임을 언급함.

* **사용자 K**: 20초 내에 이 작업을 할 수 있다면 놀라운 일임. 자신을 "빠른 계산기"로 여기지 않았음.
