알고리즘/백준

[백준] 2884 - 알람 시계

leegeonwoo 2023. 10. 17. 02:03

• 문제

알람 시계를 맞추되, 45분 앞당겨서 알람을 설정하는 문제이다.

시간은 00:00 ~ 24:00 표기법을 사용하며

주의할 점은 문제의 예제입력 2와같이 0:30을 입력했을 때 23:45으로 출력되는 부분이다.


• 풀이

 

먼저 단순하게 생각하여 문제에 요구되는 조건을 조건식으로 표현해서 풀자면,

 

문제를 풀기위해 생각해야하는 경우의 수는 3가지가 있다.

1. M이 45보다 크거나 같을 때

2. M이 45보다 작을 때

3. H가 0으로 입력되고 M이 45보다 작을 때

 

1의 경우에는 가장 간단하다 H는 가만히 냅두고 M만 45만큼 빼주면된다.

2의 경우에는 M이 45보다 작으므로 H의 값을 1빼고나서 M의 값을 계산해주어야한다.

3의 경우에는 00:00시에서 1시간만큼빼면 23시이므로 H가 0이면 H를 23으로 바꿔주어야한다. M은 2의 케이스로 똑같이 계산해주면된다.

 

1의 계산식을 세우면 M = M - 45 이고 이 식은 else문으로 넣어줄 것이기때문에 조건식은 따로 세우지 않아도된다.

2의 계산식을 세우면 H = H - 1, M = M + 60 - 45이다. 조건식은 M < 45이다.

3의 계산식을 세우면 H = 23, M = M + 60 - 45이다. 조건식으로는 H==0 && M<45가 된다.

 

이것들을 종합하여 코드로 짜보자

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int H = sc.nextInt();
		int M = sc.nextInt();
		
		if(H==0 && M<45) {  //3
			H = 23;
			M = M + 60 - 45;
		}else if(M<45) { //2
			H = H-1;
			M = M + 60 - 45;
		}else //1
			M = M-45;	
		System.out.println(H + " " + M);
	}
}

 

출력문은 시간과 분사이에 공백이 있기때문에 " "를 넣어줘야 정답처리를 받을 수 있다.


 

위의 코드를 보면 중복되는 코드가 너무 많다는걸 알 수 있다. 중복되는 코드를 제거해서 코드를 좀 더 단순하게 만들어보면 아래와 같이 확인할 수 있다.

더보기

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int H = sc.nextInt();
		int M = sc.nextInt();
		
		if(M<45) {
			H--;
			M = M + 60 -45;
			if(H <0) {
				H = 23;
			}
		}
		else {
			M = M - 45;
		}
		System.out.println(H + " " + M);
	}
}

필자는 아직 초보라 그런지 아래코드 보다는 위에 코드가 좀더 머릿속에 잘 들어오는 느낌이 든다.

중복코드를 줄이고 시간을 덜 잡아먹는 코드를 사용하는 것은 매우 중요하지만 공부하는 과정이기때문에 일단은 이해가 쉬운 코드를 사용하는 것이 좋다고 생각한다.

 

 


마무리

문제를 어떤식으로 풀어야할지 모르겠다면 먼저 종이와 펜으로 먼저 풀어보고 하나씩 차근차근 풀어나가는게 중요한 것 같다.

종이에 적어가며 이 때는 어떻게 식을 만들어야하는지, 조건식은 어떻게 만들어야하는지 천천히 코딩을 해보자

728x90