[백준] 2884번 문제 - 알람시계 - JAVA(자바)

2023. 6. 8. 16:06프로그래밍/java

백준 홈페이지에서 - 문제 많이 푼 순위별로해서 알고리즘 공부를 하고 있었으며, 

그냥 문제만 푸는것보다 어떻게 해결하고, 풀어나갔는지 솔직하게 기록에 남기고

프로그래머로써 성장하려 한다.

이 문제는

입력 시간의 -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();

        int hm = H * 60;

        int mm = hm + M - 45;

        int H1 = mm / 60;

        int M1 = mm % 60;

        if (0 < H && H <= 23) {

            System.out.println(H1 + " " + M1);

        }

        if (H == 0) {

            if (mm < 0) {

                int mm1 = 1440 + mm;

                int H2 = mm1 / 60;

                int M2 = mm1 % 60;

                System.out.println(H2 + " " + M2);

            }

        }

    }

}

 

위 방식은 

"시"를 "분"으로 치환해주고 ex) 4시 -> 4 시X 60분 = 240분

나머지 입력된 "분"과 더한뒤 -45분을 하고

다시 "시" 와 "분"으로 구분해 주는 방식을 사용하였다.

사실 너무 원시적이고 복잡하게 생각해 변수를 많이사용한것이 흠이다.

또한 "시"와 "분"의 범위를 정확히 정해주지 않은점이 있다.

 

또한 위 코드는 오류가 있었다.

 

반례로 

입력 = 0 50

출력 = 

 

위 입력값에 대한 함수를 입력하지 않았던것이다.

 

따라서

 

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();

		int hm = H * 60;
		int mm = hm + M - 45;
		int H1 = mm / 60;
		int M1 = mm % 60;

		if (0 < H && H <= 23 && 0 < M && M <=59) {
			System.out.println(H1 + " " + M1);
		}

		if (H == 0) {
			if (mm < 0) {
				int mm1 = 1440 + mm;
				int H2 = mm1 / 60;
				int M2 = mm1 % 60;

				System.out.println(H2 + " " + M2);
			} else {
				System.out.println(H1 + " " + M1);
			}
		}
	}
}

"분" 범위도 지정해주고

 

else를 집어넣어 반례가 없도록 코드를 짜보았다

 

위 코드에서는 정상적으로 출력값이 다 나왔으나

 

너무 변수를 많이 사용한점에 대해서는 만족스럽지 못해 다른 사람들은 어떻게 해결했는지 확인해 보았다.

 

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
    
		Scanner in = new Scanner(System.in);
		
		int H = in.nextInt(); // 시
		int M = in.nextInt(); // 분
		in.close();
		
		if(M < 45) {
			H--;		// 시(hour) 1 감소
			M= 60 - (45 - M); 	// 분(min) 감소
			if(H < 0) {
				H = 23;
			}
			System.out.println(H + " " + M);
		}
		else {
			System.out.println(H + " " + (M - 45));
		}
	}
}

출처 : https://st-lab.tistory.com/24

 

[백준] 2884번 : 알람 시계 - JAVA [자바]

https://www.acmicpc.net/problem/2884 2884번: 알람 시계 문제 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하

st-lab.tistory.com

위 사이트를 보았을때 아주 간단히 표현되었지만

"시"와 "분" 범위가 없어서 아쉬웟지만 앞에 If문으로 범위만 설정해준다면 문제가 없을 뿐더러

아주 간단히 표현을 잘해 깔끔한 코드라고 생각한다.