본문 바로가기

② 심화/알고리즘

[시간연산] 섬으로 가라!

728x90

문제

라이캣은 동료가 된 자바독과 함께 섬으로 향했습니다. 항구에서 배를 기다리는데 배에 탈 수 있는 사람의 수는 시간마다 다르다는 사실을 알게 되었습니다.

 

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

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

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

  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초)

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

  7. 배는 휴일도 동일하게 운항됩니다. 배는 천재지변에 영향을 받지 않습니다. 마법으로 날아다니거든요.

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

**입력** 
대기인원 = 14000605 

**출력** 
2025년 2월 413일 11시 0분 출발 

**입력** 
대기인원 = 1200202 

**출력** 
2020년 1월 1000일 11시 0분 출발

 

문법

new Date() : Date 생성자는 시간의 특정 지점을 나타내는 Date 객체를 생성합니다.Date객체는 1970년 1월 1일 UTC(국제표준시) 00:00으로부터 지난 시간을 밀리초로 나타내는유닉스 타임스탬프를 사용합니다. 단순히 Date 객체를 직접 호출했을 때, 반환 값은 Date 객체가 아니라 날짜를 나타낸 문자열입니다. JavaScript는 Date 리터럴 구문이 없습니다.

매개변수를 제공하지 않으면, 현지 시간으로 생성 순간의 날짜와 시간을 나타내는 Date 객체를 생성합니다.

const date1 = new Date('December 17, 1995 03:24:00');
// Sun Dec 17 1995 03:24:00 GMT...

const date2 = new Date('1995-12-17T03:24:00');
// Sun Dec 17 1995 03:24:00 GMT...

console.log(date1 === date2);
// expected output: false;

console.log(date1 - date2);
// expected output: 0

getFullYear() : 메서드는 주어진 날짜의 현지 시간 기준 연도를 반환합니다.

현지 시간에 따라, 주어진 날짜의 연도에 해당하는 숫자.

const moonLanding = new Date('July 20, 69 00:20:18');

console.log(moonLanding.getFullYear());
// expected output: 1969

getDay() : 메서드는 주어진 날짜의 현지 시간 기준 요일을 반환합니다. 0은 일요일을 나타냅니다. 현재의 일을 반환하려면 Date.prototype.getDate()를 사용하세요.

const birthday = new Date('August 19, 1975 23:15:30');
const day1 = birthday.getDay();
// Sunday - Saturday : 0 - 6

console.log(day1);
// expected output: 2

getHours() : 메서드는 주어진 날짜의 현지 시간 기준 시를 반환합니다.

const birthday = new Date('March 13, 08 04:20');

console.log(birthday.getHours());
// expected output: 4

getMinutes() : 메서드는 Date 인스턴스의 분을 현지 시간 기준으로 반환합니다.

const birthday = new Date('March 13, 08 04:20');

console.log(birthday.getMinutes());
// expected output: 20

getSeconds() : 메서드는 Date 객체의 초 값을 현지 시간에 맞춰 반환합니다.

const moonLanding = new Date('July 20, 69 00:20:18');

console.log(moonLanding.getSeconds());
// expected output: 18

 

풀이

    let 대기인원 = 14000605;
        /*
        9시 		25 25
        9시 10분 15 40
        9시 20분 15 55
        9시 30분 15 70
        9시 40분 15 85
        9시 50분 15 100
        
        100명씩 12시간 : 1200명
        */

        function 배를건너는시간(대기인원) {
            let 년 = 0, 월 = 0, 일 = 0, 시 = 0, 분 = 0;

            let 걸린일수 = 대기인원 / 1200;
            let 일년일수 = 0;

            for (var i = 1; i < 11; i++) {
                일년일수 += 2 ** i;
            }
            년 = parseInt((대기인원 / 1200) / 일년일수, 10);

            let 나머지일수 = (대기인원 / 1200) % 일년일수;
            let 걸린월수 = 0;

            for (var i = 10; i > 0; i--) {
                걸린월수++;
                if (나머지일수 < 2 ** i) {
                    break
                }
                나머지일수 = 나머지일수 - 2 ** i;
            }
            일 = parseInt(나머지일수, 10);
            월 = parseInt(걸린월수, 10);
            시 = parseInt((대기인원 % 1200) / 100 + 9, 10);

            let 출발분 = [25, 40, 55, 70, 85, 100];
            let 최종계산된분 = 0;

            for (let variable in 출발분) {
                if (출발분[variable] > (대기인원 % 1200) % 100) {
                    최종계산된분 = variable * 10;
                    break
                }
            }

            let date = new Date();
            최종계산된분 = 최종계산된분 + date.getMinutes();

            if (최종계산된분 > 60) {
                최종계산된분 = 최종계산된분 - 60;
                시 += 1;
            }
            분 = 최종계산된분;

            return `
            ${년}년
            ${월}월
            ${일}일
            ${시}시
            ${분}분
            `
        }
        console.log(배를건너는시간(대기인원));
728x90