오븐 시계 & 알람 시계
출처: 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