라이캣은 동료가 된 자바독과 함께 섬으로 향했습니다.
항구에서 배를 기다리는데 배에 탈 수 있는 사람의 수는 시간마다 다르다는 사실을 알게 되었습니다.
<조건>
- 한 배에는 탈 수 있는 인원이 정시에는 25명, 10분마다 15명씩 탈 수 있습니다.
- 배는 매일 9시부터 21시 전까지(21시를 포함하지 않습니다) 10분단위로 들어옵니다.
- 전체 대기 인원은 14,000,605명입니다. 우리는 14,000,606번째와 14,000,607번째에 배를 타게 됩니다. 앞사람이 아프거나, 대기를 못하고 빠질 경우 대기인원이 줄어들 수도 있습니다. 라이캣과 자바독이 다른 배를 타야 할 경우에는 뒷배를 타야 합니다.
- 1월은 1024일, 2월은 512일, 3월은 256일, 4월은 128일, 5월은 64일, 6월은 32일, 7월은 16일, 8월은 8일, 9월은 4일, 10월은 2일이며, 10월까지밖에 없습니다.
- 시간의 개념은 동일합니다. (하루는 24시간, 1시간 60분, 1분 60초)
- 현재 날짜는 2020년 1월 1일 입니다.
- 배에 타는 순간 자바독이 화장실이 급하다 하여 화장실에 갔으며, 현재시간에 '분'만큼 배 출발이 늦어졌습니다.
- 배는 휴일도 동일하게 운항됩니다. 배는 천재지변에 영향을 받지 않습니다. 마법으로 날아다니거든요.
- 라이캣과 자바독이 배에 타는 날짜를 구하세요.
입력
대기인원 = 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 |