문제
연월일을 YYYYMMDD의 8자리 정수로 나타내었을 때 2진수로 변환하여 거꾸로 나열한 다음 다시 10진수로 되돌렸을 때 원래 날짜와 같은 날짜가 되는 것을 찾아보세요. 기간은 지난 도쿄 올림픽(1964년 10월 10일)부터 다음 도쿄 올림픽(2020년 7월 24일 예정)으로 하겠습니다.
ex)
1. YYYYMMDD의 포맷 -> 19660713
2. 2진수로 변환 -> 1001010111111111110101001
3. 2진수를 거꾸로 나열 -> 1001010111111111110101001
4. 거꾸로 나열한 2진수를 10진수로 되돌림 -> 19660713
난이도
IQ 80
목표시간
20분
풀이(c#,VS)
1.진수변환,문자열Reverse
2.DateTime 생성자 에러로 날짜변환 가능여부 판단
/*
* 2020.01.30
* ksj
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _6_BinaryConversionOfDates
{
class Program
{
static void Main(string[] args)
{
int start = 19641010;
int end = 20200724;
for (int i = start; i <= end; i++)
{
string binarayNum = Convert.ToString(i, 2);
string ReverseNum = new string(binarayNum.ToCharArray().Reverse().ToArray());
if (binarayNum.Equals(ReverseNum))
{
try
{
string decimalNum = Convert.ToInt32(binarayNum, 2).ToString();
new DateTime(Convert.ToInt32(decimalNum.Substring(0, 4)), Convert.ToInt32(decimalNum.Substring(4, 2)), Convert.ToInt32(decimalNum.Substring(6, 2)));
Console.WriteLine(decimalNum);
}
catch
{
//날짜 형식 변화 불가
}
}
}
}
}
}
문제정답(사용언어:python)
1.탐색 범위를 확인한다.
19641010 : 1001010111011001010110010
20200724 : 1001101000011110100010100
2. 25자리이며 앞자리가 1001로 공통이다.
3. 이진수를 reverse했을 일치해야하므로
4. 탐색범위는 1001 ******** * ******** 1001 과 같은 형태다
5. 5~12자리 수와 14~21자리 수 역시 대칭되어야 하므로 일치된다.
6. 따라서 5~12자리수만 탐색 하면된다.
# 날짜를 다루는 datetime 클래스 불러오기
from datetime import datetime, timedelta
# 대상 기간에서 2진수의 5번째 문자부터 8개의 문자 추출
from_left = int(bin(19641010).replace("0b","")[4:4 +8],2)
to_left = int(bin(20200724).replace("0b","")[4:4 +8],2)
# 좌우의 8문자를 반복
for i in range(from_left, to_left+1):
l = "{0:08b}".format(i) # 왼쪽
r = l[::-1]
for m in range(0, 1+1):
value = "1001{}{}{}1001".format(l, m, r)
try:
# 변환 가능한지 확인
date = datetime.strptime(str(int(value,2)), "%Y%m%d")
# 변환 가능할 경우 출력
print(date.strftime("%Y-%m-%d"))
except:
# 변환 불가
pass
배운점
날짜형식인지 여부를 datetime api 에러로 쉽게 확인.
탐색 범위를 연구하여 규칙성을 찾고 탐색 범위를 줄임.
단, 제시된 조건에서만 적용되는 규칙성이기 때문에 확장성이 없고 규칙성을 이해하고 있는 사람이 아니라면 소스코드만 보고 문제를 이해하기 힘들다.
'Algorithm > Solving' 카테고리의 다른 글
[책-알고리즘퍼즐68]9.남녀 불균형 (0) | 2020.02.04 |
---|---|
[책-알고리즘퍼즐68]8.똑똑한 로봇 청소기 (0) | 2020.01.31 |
[책-알고리즘퍼즐68]6.콜라츠 추측 (0) | 2020.01.28 |
[책-알고리즘퍼즐68]5.환전자판기 (0) | 2020.01.20 |
[책-알고리즘퍼즐68]4.막대자르기 (0) | 2020.01.20 |