🔎

답안

 
import java.util.Calendar; public class Q3 { public static void main(String[] args) { int 대기인원 = 14000605; solution(대기인원); } public static void solution(int 대기인원) { int 일년일수 = 0; for (int i = 10; i > 0; i--) { 일년일수 += (int)Math.pow(2, i); } int 대기일 = 대기인원 / 1200; int 연도 = 대기일 / 일년일수; int 남은일수 = 대기일 % 일년일수; int 월 = 0; for (int i = 10; i > 0; i--) { 월++; if (남은일수 < (int)Math.pow(2, i)) { break; } 남은일수 -= (int)Math.pow(2, i); } int 일 = 남은일수; int 최종남은인원 = 대기인원 % 1200; int 시 = 최종남은인원 / 100 + 9; int[] 출발분 = {25, 40, 55, 70, 85, 100}; int 몇분에탈지계산 = 최종남은인원 % 100 + 1; int 당일출발_분 = 0; for (int i = 0; i < 출발분.length; i++) { if (출발분[i] > 몇분에탈지계산) { 당일출발_분 = i * 10; break; } } Calendar 오늘시간 = Calendar.getInstance(); int 분 = 오늘시간.get(Calendar.MINUTE) + 당일출발_분; if (분 > 60) { 분 = 분 - 60; 시++; } System.out.println((연도 + 2020) + "년 " + 월 + "월 " + 일 + "일 " + 시 + "시 " + 분 + "분"); } }
 

1. 문제 파악

  1. 문제에 주어진 1년이 실제 1년 일수와 다르기 때문에 주의해야 합니다. 문제에 주어진 1년은 2의 승수로 표현할 수 있습니다.
  1. '분'은 현재 시간을 기준으로 구해야 하기 때문에 Date를 import해야 합니다.
  1. 라이캣과 자바독이 다른 배를 타야 할 경우에는 뒷배를 타야 한다는 문제의 조건에 따라 몇 분에 탈 지 계산할 때 별도의 조건이 필요합니다.
  1. 탈 수 있는 인원이 정시에는 25명, 10분마다 15명씩 탈 수 있기 때문에 분마다 탑승 인원이 달라진다는 사실을 알 수 있습니다.

2. 풀이

  1. 각 '월'이 2의 승수임을 유념하고 합을 구해 일년일수를 알아냅니다. 그리고 하루에 1200명이 탑승하기 때문에 대기인원을 1200으로 나눈 값이 대기일이 되고, 이를 일년일수로 나눠 '연도'를 구합니다.
    1. int 일년일수 = 0; for (int i = 10; i > 0; i--) { 일년일수 += (int)Math.pow(2, i); } int 대기일 = 대기인원 / 1200; int 연도 = 대기일 / 일년일수;
       
  1. '월'을 구하기 위해서는 '연도'를 구한 후 나머지 값을 이용할 수 있습니다. '월' 또한 '월'마다 각기 다른 2의 승수 값임을 유념하여 '월'과 남은 일수를 구합니다. 이때 남은 일수는 '일'이 됩니다.
    1. int 남은일수 = 대기일 % 일년일수; int 월 = 0; for (int i = 10; i > 0; i--) { 월++; if (남은일수 < (int)Math.pow(2, i)) { break; } 남은일수 -= (int)Math.pow(2, i); } int 일 = 남은일수;
       
  1. 시간을 구하기 위해서 남은 인원을 구해야 합니다. 하루에 1200명이 탑승하므로 이 값으로 나눈 나머지가 라이캣과 자바독이 타는 날이 되고 남은 인원에 따라 몇 번째 탑승하는지 알 수 있기 때문에 그날에 탑승하게 될 시간을 알 수 있습니다. 이때 배는 9시 정각에 출발하기 때문에 9를 더합니다.
    1. int 최종남은인원 = 대기인원 % 1200; int 시 = 최종남은인원 / 100 + 9;
       
  1. '분'은 라이캣과 자바독이 같은 배를 타야하기 때문에 만약 다른 배에 탑승하게 될 경우를 생각해서 1만큼 더해 뒷 배를 탈 수 있도록 맞춰줍니다.
    1. int 몇분에탈지계산 = 최종남은인원 % 100 + 1;
       
  1. 분마다 탑승인원이 다르기 때문에 이를 배열로 만들어 반복문을 돌면서 당일 출발 분을 구해줍니다. 이때 생성된 배열과 분의 관계는 배열의 인덱스 * 10으로 이루어져 있습니다. (예를 들어, 10분엔 25명, 20분엔 40명)
    1. int 당일출발_분 = 0; for (int i = 0; i < 출발분.length; i++) { if (출발분[i] > 몇분에탈지계산) { 당일출발_분 = i * 10; break; } }
       
  1. 자바독이 화장실에 다녀와야 하기 때문에 현재 시간에 '분'만큼 늦어진 것이므로 우선 현재 시간을 구해야 합니다. Date 클래스를 이용해서 현재 시간을 구한 뒤, 아까 구한 당일 출발 분을 더해 최종 시간을 알아냅니다.
    1. Calendar 오늘시간 = Calendar.getInstance(); int 분 = 오늘시간.get(Calendar.MINUTE) + 당일출발_분;
       
  1. 이때 '분'이 60을 넘게 되면 '시'가 바뀌는 것을 유념하여 조건문을 생성해서 이를 확인해 줍니다.
    1. if (분 > 60) { 분 = 분 - 60; 시++; }