문제
대부분의 DGIST 기초학부 학생들은 기숙사에서 생활하고 있습니다. 여름이 다가옴에 따라 자유롭게 온도를 설정할 수 있는 시원한 에어컨을 사용하게 될 예정입니다. 안타깝게도 에어컨은 매일 15, 18, 21시 정각에 자동으로 꺼지게 설계되어 있습니다. 더군다나 에어컨의 내장 시계가 고장이 나서 세 번째로 꺼질 때마다 에어컨의 시계는 K분간 멈추게 됩니다.
편안한 낮잠을 위해 정시에 맞춰 에어컨을 켜주는 기계를 만들어 둔 정디지 양은 정확한 시간에 에어컨이 켜지지 않자 화가 나기 시작했습니다. 정디지양이 회로이론 과제를 내주기 전에 여러분이 N일째의 에어컨이 꺼지는 시각을 예측해 전원을 켜는 기계를 만들어 정디지양이 화를 내지 않도록 잘 다독여줍시다. (날짜는 0일 00시 00분부터 시작되며 에어컨은 켜져있는 상태입니다.)
입력
날짜를 의미하는 정수 N과 지연되는 분을 의미하는 정수 K가 공백을 사이에 두고 주어집니다.
(0≤N≤1,000,0≤K<60)
출력
첫 줄에 N일째에 에어컨이 켜진 횟수 M을 출력합니다.
둘째 줄부터 M개의 줄에 걸쳐 에어컨이 꺼지는 시간을 hh:mm 형식으로 오름차순으로 출력합니다.
https://www.acmicpc.net/problem/25044
25044번: 에어컨
대부분의 DGIST 기초학부 학생들은 기숙사에서 생활하고 있습니다. 여름이 다가옴에 따라 자유롭게 온도를 설정할 수 있는 시원한 에어컨을 사용하게 될 예정입니다. 안타깝게도 에어컨은 매일 1
www.acmicpc.net
접근
시간을 구하는 문제이다.
시간과 관련된 문제는
1) Date, Calender 를 이용하여 해결
2) 시간을 일/시/분/초를 통일하여 해결
하는 해결책이 있다.
이 중 2)번 방법을 사용하고, 단위를 분으로 통일하였다.
에어컨은 꺼지자마자 다시 가동시킴으로
종료시간~다음종료시간 까지의 시간이 일정하다. (처음 제외)
에어컨이 몇번째로 꺼졌는지를 판단하고 다음 종료시간을 계산한다.
이 때, 3번째마다 K분씩 더한 값을 종료시간에 더한다.
N+1일 00:00 이 넘을때까지 에어컨을 가동시키고
N일 00:00 이상일 경우 꺼지는 시간을 기록한다.
출력 방식은 hh:mm 이므로 String.format을 이용하였다.
구현
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
//https://www.acmicpc.net/problem/25044
//분을 hh:mm 형태로 변환하는 클래스
static class AirTime{
int min;
public AirTime(int min) {
this.min=min;
}
public String getHourAndMin() {
return String.format("%02d:%02d",(min/60)%24,min%60);
}
}
//일 -> 분
public static int dayToMin(int day) {
return day*24*60;
}
//분 -> 시
public static int getHour(int min) {
return min/60;
}
//분 -> min 단위만 가져옴
public static int getMin(int min) {
return min%60;
}
//문제 해결
public static List<AirTime> airTimes(int day, int stopMin) {
//종료 시간까지의 텀
int[] stopTerms = {3*60, 3*60, 18*60 };
List<AirTime> list = new ArrayList<>();
//종료된 횟수 -1
int count = 0;
//첫 종료 시간, 0일 15:00
int min = 15*60;
//오늘의 날짜
int today = dayToMin(day);
//내일의 날짜
int tomorrow = dayToMin(day+1);
//종료 시간이 내일보다 작으면
while(min<tomorrow) {
//오늘의 종료시간이라면 추가
if(min>=today) {
list.add(new AirTime(min));
}
//다음 종료시간
min+=stopTerms[count%3];
//3번째 종료시간이라면 정지 시간 추가
if(count%3==2) min+=stopMin;
//횟수 증가
count++;
}
//list 반환
return list;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken()); //일
int k=Integer.parseInt(st.nextToken()); //시계가 멈춘 분
//답 리스트
List<AirTime> list = airTimes(n, k);
//리스트 크기 = 답의 개수
bw.append(list.size()+"\n");
//hh:mm 형태로 출력
for(AirTime airTime : list) {
bw.append(airTime.getHourAndMin()+"\n");
}
bw.close();
br.close();
}
}
'알고리즘' 카테고리의 다른 글
[백준] 25046번 / 25047번: 사각형 게임 Java (0) | 2022.05.04 |
---|---|
[백준] 25045번: 비즈마켓 Java (0) | 2022.05.03 |
[백준] 10163번: 색종이 Java (0) | 2022.04.29 |
[백준] 17472번: 다리 만들기2 Java (0) | 2022.04.28 |
[백준] 4386번: 별자리 만들기 Java (0) | 2022.04.27 |
댓글