간지(干支)

문제

언어

  • JavaScript

순서도

  1. 0 ~ 9 년이 십간으로 어떻게 표현될 수 있는지 정의
  2. 0 ~ 11 년이 십이지로 어떻게 표현될 수 있는지 정의
  3. 주어진 N 을 십간과 십이지로 표현

문제 풀이 step 1

  • 십간 : 을병정무기경신임계
  • 십이지 : 자축인묘진사오미신유술해
  • 이 십간과 십이지로 구성된 간지를 사용해 60년을 주기로 각 연도에 이름을 부여합니다.
    • 최초 1 년째 : 갑자
    • 2 년째 : 을축
    • 3 년째 : 병인
  • 이러한 간지를 서양식으로 나타내기 위해서
    • 십간 : 0 1 2 3 4 5 6 7 8 9
    • 십이지 : A B C D E F G H I J K L
    • 십간과 십이지의 순서 바꾸기

문제 풀이 step 2

  • N 이 주어질 때, 그 N 을 서양식 간지로 표현하는 문제입니다.
  • 2013 년이 계사년으로 “F9” 로 표현된다는 것을 기반으로 풀어야 합니다.
  • 십간과 십이지를 별도로 분리해서 십간 따로 십이지 따로 생각하면 간단하게 풀 수 있습니다.
  • 십간을 먼저 살펴보면, 2013 년이 9 로 표현되고, 2014 년은 0 으로 표현됩니다.
    • 십간은 총 10 개로 10 개의 숫자가 계속해서 반복되고 있습니다.
    • 즉, 년도의 마지막 숫자가
      • 4 면 0,
      • 5 면 1,
      • 6 이면 2,
      • …,
      • 2 면 8,
      • 3 이면 9,
      • 이를 배열로 표현하면 [6, 7, 8, 9, 0, 1, 2, 3, 4, 5] 과 같습니다.
    • 따라서 주어진 N 년도의 마지막 숫자에 맞게 배열의 값을 사용하면 되겠습니다.
  • 십이지를 살펴보면, 2013 년이 F 로 표현되고, 2014 년이 G 로 표현됩니다.
    • 십이지는 총 12 개로 12 개의 알파벳이 계속해서 반복되고 있습니다.
    • 십간은 총 10 개라서 딱 맞아떨어지지만 십이지는 그렇진 않습니다.
    • 따라서 0 년부터 11 년까지 십이지로 어떻게 표현되는지 알아봐야 합니다.
    • 2013 년이 F 로 표현되니까 9(2013 % 12) 년이 F 로 표현됩니다.
      • 이를 기반해서 배열로 표현하면 [“I”, “J”, “K”, “L”, “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”] 과 같습니다.
    • 주어진 N 년도를 12 로 나눈 나머지에 맞게 배열의 값을 사용하면 되겠습니다.
  • 추가 설명은 주석으로 작성하겠습니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	// 우선, 최소 공배수인 60 으로 나머지 연산 진행
	const n = Number(input[0]) % 60;

	// 십간을 배열로 표현
	const ten = [6, 7, 8, 9, 0, 1, 2, 3, 4, 5];
	// 십이지를 배열로 표현
	const twelve = ["I", "J", "K", "L", "A", "B", "C", "D", "E", "F", "G", "H"];

	// 각각 십간과 십이지를 별도로 해서 계산
	return `${twelve[n % 12]}${ten[n % 10]}`;
};

console.log(solution(input));