문제3: 섬으로 건너가라!

문제

배에 탈 수 있는 사람의 수는 시간마다 다르다

  1. 한 배에는 탈 수 있는 인원이 정시에는 25명, 10분 마다 15명씩 탈 수 있습니다.

  2. 배는 매일 9시부터 21시 전까지(21시를 포함하지 않음) 10분 단위로 들어옵니다.

  3. 전체 대기 인원은 14000605명 입니다. 우리는 14000606번째와 14000706번째에 배를 타게 됩니다.
    앞사람이 아프거나, 대기를 못하고 빠질 경우 대기인원이 줄어들 수도 있습니다.
    라이캣과 자바독이 다른 배를 타야 할 경우에는 뒷배를 타야 합니다.

  4. 1월은 1024일, 2월은 512일, 3월은 256일, 4월은 128일, 5월은 64일,
    6월은 32일, 7월은 16일, 8월은 8일, 9월은 4일, 10월은 2일, 10월 까지 밖에 없습니다.

  5. 시간의 개념은 동일합니다. (하루는 24시간, 1시간 60분, 1분 60초)

    • 현재 날짜는 2021년 1월 1일입니다.
  6. 배에 타는 순간 자바독이 화장실이 급하다 하여 화장실에 갔으며, 현재 시간에 '분' 만큼 배 출발이 늦어졌습니다.

  7. 배는 휴일도 동일하게 운항됩니다. 배는 천재지변에 영향을 받지 않습니다.

  8. 라이캣과 자바독이 배에 타는 날짜를 구하세요.


예제

예제1

Input : 14000605
output : 2026년 2월 413일 11시 0분 출발
Input : 1200202
output : 2021년 1월 1000일 11시 0분 출발

Output에 문제가 있다고 생각할 수 있지만.
4번 보기를 보면 이해할 수 있다. 우리가 아는 태양력이 아닌것이다!

풀이

1월은 1024일
2월은 512일
3월은 256일
4월은 128일
5월은 64일
6월은 32일
7월은 16일
8월은 8일
9월은 4일
10월은 2일
1년 2046일이다.


1시간 100명 9시 ~ 21시까지 (21시 제외) 즉, 하루 1200명 탑승 가능

회차시간인원
19시25명
29시 10분15명
39시 20분15명
49시 30분15명
59시 40분15명
69시 50분15명
합계100명

function question() {
	const input = 14000605;
	return func(input);
}
function func(waitPeoples) {
	// 1시간동안 배가 출발하는 분
	let startMinArr = [25, 40, 55, 70, 85, 100];
	// 1년의 총 일수
	let yearDate = 0;
	for (let i = 10; i > 0; i--) {
		yearDate += 1 << i;
	}
	// 하루 탑승인원 수
	let dayNumPassengers = 1200;
	// 대기일
	let waitDate = waitPeoples / dayNumPassengers;
	// 연도
	let year = Math.floor(waitDate / yearDate);
	// 나머지 일수
	let remainDay = waitDate % yearDate;
	// 월
	let month = 0;
	for (let i = 10; i > 0; i--) {
		month++;
		let monthDay = 1 << i;
		if (remainDay < monthDay) {
			break;
		}
		remainDay -= monthDay;
	}
	// 일
	let day = Math.floor(remainDay);
	// 남은 인원 수
	let remainPeoples = waitPeoples % dayNumPassengers;
	// 시, 둘이 같은 배를 타야하기에 다음날로 넘어 갈 경우 9시 부터 출발한다.
	let hour = Math.floor(remainPeoples / 100 + 9);
	// 배를 타야하는 '분'
	let rideMin = (remainPeoples % 100) + 1;
	let startMin = 0;
	// 배를 타야하는 분과 배가 출발하는 분과 비교 하여 출발해야하는 분을 구함
	for (let [idx, minItem] of startMinArr.entries()) {
		if (minItem > rideMin) {
			startMin = idx * 10;
			break;
		}
	}
	// 현재 시간, 6번 보기로 인해 '현재 시간에 '분' 만큼 배 출발이 늦어졌습니다.' 를 계산
	let now = new Date();
	let min = now.getMinutes() + startMin;
	// 만약 분이 60분을 초과 하면 1시간을 추가 시켜줘야 한다.
	if (min > 60) {
		min = min - 60;
		hour++;
	}
	return `${2021 + year}${month}${day}${hour}${min}분 출발`;
}

좋은 웹페이지 즐겨찾기