본문 바로가기
알고리즘

[백준] 25044번: 에어컨 Java

by 랼랼 2022. 5. 2.

문제

대부분의 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();
	}
}
반응형

댓글