섬으로 건너가라!

이종혁·2020년 6월 15일
0

알고리즘

목록 보기
3/4

섬을 건너기 위해서 대기인원이 모두 섬을 건널 수 있는 시간을 구해라.
아침 9시부터 21시까지, 정시에는 25명, 10분 마다 15명씩 누적된 인원들이 섬을 건널수 있다.
(1시간에 100명, 하루 1200명)
1월은 1024일, 2월은 512일, 3월은 256일 ... 10월은 2일까지 있다.

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

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

  let 나머지일수 = (대기인원 / 1200) % 일년일수;
  let 걸린월수 = 0;
  for (let i = 10; i > 1; i--) {
    걸린월수++;
    if (나머지일수 < 2 ** i) {
      break;
    }
    나머지일수 = 나머지일수 - 2 ** i;
  }
  일 = parseInt(나머지일수, 10);
  월 = parseInt(걸린월수 - 1, 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(배를건너는시간(대기인원));

대기인원 = 14,000,605명

'걸린일수' : 대기인원 / 1200명
11667.170833334일
'년' : '걸린일수' / 일년일수
5.7년
일년일수 : 2 + 4 + 8 ... 1024

먼저, 5년하고 남은 나머지일수를 구한다.
'나머지일수' : 걸린일수 % 일년일수
1437.17083336일

걸린월수++ 는 해당되는 월을 카운트한다.

1437일이 1024보다 적기 때문에 나머지일수는 1437-1024 = 413일이 된다.

413일은 2**i (2월의 512일) 보다 적기 때문에 break;

'나머지일수'는 해당되는 월에서 멈출것이다.

'시간' : 대기인원을 1200으로 나누고 남은 '수'는 12시간 동안 배에 탑승하지 못하고 남은 인원이다.
205명이 남으면, 100으로 나눈다.(100은 시간당 탈 수 있는 인원).
9를 더하는 이유는 9시가 팁승시간이기 때문이다. 그러면 11시가 된다.

'분' : 나머지 5명이은 몇분안에 타는지 알아보기 위해,
'출발분' 배열을 만들고,
(대기인원 % 1200) % 100 는 5가 나온다.
(하투탑승인원으로 나눈 사람에서 100으로 나누고 남은 인원 : 5)
5명은 25보다 적기때문에 11시 정시에 출발한다.

최종계산된 분에 getMinutes()를 더해주는 이유?
6번에 '현재시간에 분 만큼 배 출발이 늦어졌습니다'
더해주고 60보다 클경우를 대비해서 60을 빼주고, 시간이 넘어가니 시에 +1을 한다.

출처 : https://www.inflearn.com/course/코딩-테스트-전날

profile
Junior Developer

0개의 댓글