[Baekjoon] 오븐 시계&알람 시계

Date:     Last Updated:

오븐 시계 & 알람 시계

출처: Baekjoon
오븐 시계
알람 시계

문제의 이해

  • 6/10일 itwill 스터디에서 풀었던 문제.
  • 두 문제 모두 시간을 다루는 문제.

내가 생각한 풀이 방법

  • 시간을 다루는 문제의 특징은 초분시가 각각 60/60/24를 기준으로 다시 0으로 초기화 된다는 것.
  • 그것만 이해하고 if문을 쓰면 사실 어렵지 않게 풀 수 있는 문제들이다.

첫 번째 풀이

오븐 시계 풀이

코드자체가 어렵지 않다. 입력받아서 계산해주는 부분이 끝. 처음에는 시간 관련 문제는 그냥 이런식으로 풀면 된다고 생각했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Scanner;

public class Main {
public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        int nHour = 0;
        int nMinute = 0;
        int nTime = 0;
        
        nHour = sc.nextInt();
        nMinute = sc.nextInt();
        nTime = sc.nextInt();
        
        nHour = nHour + ((nTime + nMinute) / 60);
        nMinute = (nMinute + nTime) % 60;
        
        if(nHour > 23){
            nHour %= 24;
        }
        System.out.println(nHour + " " + nMinute);
    }
}

알람 시계 풀이

이 문제도 비슷했다. if문이나 삼항연산자를 통해서 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.Scanner;

public class Main {
	public static void main(String[] args){

		Scanner sc = new Scanner(System.in);
		int nHour = 0;
		int nMinute = 0;

		nHour = sc.nextInt();
		nMinute = sc.nextInt();

		nHour += nMinute - 45 < 0 ? -1 : 0;
		nMinute += nMinute - 45 < 0 ? 15 :-45;
		nHour = nHour < 0 ? 23 : nHour; 


		//        if((nMinute / 45) == 0) {
			//        	nMinute %= 45;
			//            nHour -= 1;
		//        }
		//        
		//        if((nMinute - 45) < 0){
		//            nMinute = 60 - (nMinute - 45) * -1;
		//            nHour -= 1;
		//        }
		//        else {
		//        	nMinute -= 45;
		//        }
		//        
		//        if(nHour < 0){
		//            nHour = 23;
		//        }
		System.out.println(nHour + " " + nMinute);
	}
}

공식과 API의 필요성

1. 일반형, 표준형, 공식(모두 같은 말이다.)

  • 두개의 문제 모두 6/10일 스터디에서 풀었다.
  • 어렵지 않아서 딱히 별 생각 없었는데 사람들이 왜 스터디를 하는 지 알게 되었다.
  • 나는 if&삼항으로 풀었는데 같이 하던 친구중에 수학을 할줄 아는 친구는 일반식을 만들어서 풀었다.
  • 그걸 보고 일반식&공식을 도출할 수 있으면 조건문&반복문을 줄일 수 있다는 생각이 꽤 많이 들었다.

2. API의 필요성

  • 2개의 시간 문제를 풀다보니 비효율이 느껴졌다.
  • 굳이 거의 동일한 처리의 문제인데 2번이나 코드를 만들 이유가 없다고 느껴져서이다.
  • Time이라는 class만들어서 정리 해 놓으면 이런 문제들은 아주 쉽게 풀 수 있다는 생각이 들었다.
  • 거기에 위에서 말한 공식으로 작성해 놓으면 다 깔끔하겠다 라는 생각에 관련 class를 만들어봤다.

두 번째 풀이

오븐 시계 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.Scanner;

class TimeP{
	enum TwentyFourSystem{
		twelve,
		twentyFour
	}

	int curHour = 0;  //설정 시간
	int curMinute = 0;//설정 분
	int curSecond = 0;//설정 초(당장은 불필요해서 변수 선언만 해 두었다.)
	TwentyFourSystem timeSys = null;  //12시간제와 24시간제 선택(마찬가지로 당장은 필요 없어서 선언만)
	
	public TimeP(int pHour, int pMinute) {
		curHour = pHour;
		curMinute = pMinute;
		curSecond = 0;
		timeSys = TwentyFourSystem.twentyFour;
	}

  
	public void changeHour(int pHour) { //시간만 변경하면 될때 쓸 메서드
		changeMinute(pHour * 60);
	}

	public void changeMinute(int pHourMinute) { //분만 변경하면 될때 쓸 메서드(다만 분을 바꾸면 시간도 바뀌는 경우가 많아서 결국 이 메서드가 다 처리하는 부분)
		int tHour = curHour;
		int tMinute = curMinute;
		
		curHour = ((1440 + tHour * 60 + tMinute + pHourMinute) / 60) % 24;
		curMinute = (1440 + tHour * 60 + tMinute + pHourMinute) % 60;
    //내가 생각한 시간을 변경할때의 일반식이다. 빼는것도, 더하는 것도 모두 가능하다.
    //여기서 추가할 사항이 있다면, 초를 계산하는 메서드와 /24를 하면 일(day)이 나오는데 그것도 나중에 추가하면 더 좋아질 듯
	}

	public void changeTime(int pHour, int pMinute) {  //시간과 분, 두개를 입력받는 메서드(처리는 분으로 변경해서 changeMinute메서드에서 한다.)

		changeMinute(pHour * 60 + pMinute);
	}
	
	public void printTime() {
		System.out.println(curHour + " " + curMinute);
	}
}

public class Main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int inputHour = 0;
		int inputMinute = 0;
		int earlyTime = 0;
		
		inputHour = Integer.parseInt(sc.next());
		inputMinute = Integer.parseInt(sc.next());
		earlyTime = Integer.parseInt(sc.next());
		
		TimeP tp = new TimeP(inputHour, inputMinute);
		tp.changeMinute(earlyTime);
		tp.printTime();
		
	}
}

알람 시계 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Scanner;

//class TimeP{} 포함

public class Main {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int inputHour = 0;
		int inputMinute = 0;
		final int earlyTime = -45;
		
		inputHour = Integer.parseInt(sc.next());
		inputMinute = Integer.parseInt(sc.next());
		
		TimeP tp = new TimeP(inputHour, inputMinute);
		tp.changeMinute(earlyTime);
		tp.printTime();
		
	}
}

마무리

  • 이렇게 API처럼 만드니까 재사용도 되고 코드도 훨씬 깔끔해졌고, 무엇보다도 좀 많이 재미있었다.
  • 특히 재사용한 부분과 공식을 만들어서 사용한 부분이 개인적으로 너무 맘에 들었다.
  • 앞으로 다른 문제들도 이렇게 공식을 만들어서 풀 수 있으면 좋겠다.


Leave a comment