본문 바로가기
인프런 스터디

[Python] 문제3 - 섬으로 건너가라!

by KAYEON 2021. 7. 19.

라이캣은 동료가 된 자바독과 함께 섬으로 향했습니다.

항구에서 배를 기다리는데 배에 탈 수 있는 사람의 수는 시간마다 다르다는 사실을 알게 되었습니다.

 

 

<조건>

  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분 출발

 

 

시작!

1. 탑승 인원, 대기일 구하기

대기인원 = 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명

대기일 = 대기인원 // 1200
>> 11667

한 시간당 100명씩 탑승 가능

하루에 12시간 운행하므로 하루에 1200명 탑승 가능

즉, 대기일 = 대기인원 // 1200

 

 

2. 탑승 월 구하기

일년일수 = 0
for i in range(10, 0, -1):
	print(2**i)
    일년일수 += 2**i
>> 2046

 

대기일 // 일년일수
>> 5

남은 일수 = 대기일 % 일년일수
>> 1437 // 2월

2의 i승 => 각각 월의 일수

월 일수 다 합치면 일년일수 => 2046일

 

대기일을 일년일수로 나눈 몫 값 >> 5

대기일을 일년일수로 나눈 나머지 값 >> 1437

 

총 5년 1437일이 걸리는 걸 알 수 있다

1월이 1024일, 2월이 512일이므로 1437일 => 2월

 

 

3. 탑승 일 구하기

월별일수누적값 = 0
월 = 0

for i in range(10, 0, -1):
	차감일 = 월별일수누적값
    월별일수누적값 += 2**i
    월 += 1
    if 월별일수누적값 > 남은일수:
    	break

남은일수 - 차감일
>> 413

차감일은 전달까지의 누적값을 가지고 있으므로

남은일수 - 차감일 >> 413

2월 중 413일날 배를 타게 된다

 

 

4. 최종 남은 인원 구하기

최종남은인원 = 대기인원 % 1200
>> 205

대기인원을 1200(하루 탑승 인원)으로 나눈 나머지 값 >> 205

 

 

5. 출발 시/분 구하기

출발시 = 최종남은인원 // 100 + 9 #우리가 출발할 시
>> 11

출발분 = [25, 40, 55, 70, 85, 100]
해당시간에남은인원 = 최종남은인원 % 100 + 1

for i in 출발분:
   if i > 해당시간에남은인원:
      분 = 출발분.index(i) * 10
      break

최종 남은 인원을 100(한 시간 탑승 인원)으로 나눈 몫에

9시부터 출발하므로 9를 더해주면 출발 시를 구할 수 있음

 

10분 간격의 탑승 인원 누적값은 '출발분' 리스트로 저장

 

같은 배를 타야 하므로 1시간을 넘을 경우 -60을 하고 1시간 더해주기

# 마지막 배인 경우는 고려하지 않음

 

 

 

** 최종 정리 **

import datetime

오늘시간 = datetime.datetime.today()
대기인원 = 14000605

def solution(대기인원):
   일년일수 = 0
   for i in range(10, 0, -1):
      일년일수 += 2**i
      년 = (대기인원 // 1200) // 일년일수
      남은일수 = (대기인원 // 1200) % 일년일수
   
   월별일수누적값 = 0
   월 = 0
   for i in range(10, 0, -1):
      차감일 = 월별일수누적값
      월별일수누적값 += 2**i
      월 += 1
      if 월별일수누적값 > 남은일수:
         break
            
    일 = 남은일수 - 차감일
    최종남은인원 = 대기인원 % 1200
    시 = 최종남은인원 // 100 + 9
    
    출발분 = [25, 40, 55, 70, 85, 100]
    해당시간에남은인원 = 최종남은인원 % 100 + 1
    for i in 출발분:
       if i > 해당시간에남은인원:
          분 = 출발분.index(i) * 10
          break
          
   if 최종남은인원 % 100 == 99:
      시 += 1
      분 = 0
      
   if(오늘시간.minute + 분 > 60):
      분 = (오늘시간.minute + 분) - 60
      시 += 1
      
   return f'{년+2020}년 {월}월 {일}일 {시}시 {분}분 출발'

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

 

'인프런 스터디' 카테고리의 다른 글

[Python] 재귀함수  (0) 2021.07.20
[Python] 문제1 - 암호를 해독해라!  (0) 2021.07.06