회고록 블로그

[백준 코테 풀기] 2884번. 알람 시계 본문

4. 기타 공부/코테 준비

[백준 코테 풀기] 2884번. 알람 시계

김간장 2021. 12. 3. 00:27

[문제]

https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

 

[풀이]

위와 같은 방향으로 코드 작성을 계획했다.

import java.util.Scanner;

class MorningAlarm {
	private int hour;
	private int minute;
	
	MorningAlarm(int h, int m) {
		if(h >= 0 && h <= 23)
			hour = h;
		else
			hour = 0; // 시(0~23시)를 넘어가면 0으로 임의 설정	
		if(m >= 0 && m <= 59)
			minute = m;
		else
			minute = 0; // 분(0~59분)을 넘어가면 0으로 임의 설정
	}
	void changeTime() {
		if(minute >= 45)
			minute -= 45;
		else {
			if(hour == 0)
				hour = 23;
			else
				hour--;
			minute += 15;
		}
	}
	void printAlarm() {
		changeTime();
		System.out.println(hour+" "+minute);
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		MorningAlarm alarm = new MorningAlarm(sc.nextInt(), sc.nextInt());
		sc.close();
		
		alarm.printAlarm();
	}
}

 

많은 능력자분들의 여러 코드를 읽다보니 Scanner 인스턴스를 사용한 후에는 명시적으로 닫아주는 것이 좋다고해서

close 메소드를 넣었다.

 

최대한 메인 메소드를 간결하게 쓰고자 노력해서 그런지, 클래스가 복잡해졌다.

더구나 문제에서 제시하지 않은 내용(e.g. 분(minute)이 0과 59 사이가 아니면 강제로 0으로 세팅 등)을 넣어서 그런지 더 코드가 길어졌다.

 

[기타]

사실, 문제 내용 중에서 아래와 같은 문구가 있어서 좀 혼란스러웠다.

왜냐하면..

사용자가 입력을 "23[Tab]47[Enter]"과 같이 입력하면 출력도 "23[Tab]2[Enter]"로 나와야하는건가?

"23[Space bar]47[Enter]"로 입력하면 "23[Space bar]2[Enter]"로 나와야하는거고?

이렇게 생각했기 때문이다.

(쉽게 말하면, 입력할 때 사용한 구분 문자가 Tab일 수도 Space bar일 수도 있는데, 어떻게 출력을 같은 형태로 출력하나 싶었다)

 

 

그래서 이걸 구현해내기 위해서 Scanner 클래스를 읽으면서 delimiter 변수를 찾아내고

이 변수를 이용해서 어떻게든 입력한 그대로 출력해보려고 했는데 실패했다.

 

몇 시간 고민하다가 결국..

 

입력할 때 사용한 구분 문자를 찾아와서 출력할 때도 같은 형태로 출력은 못하겠으니 (ㅜㅜ)

차라리 구분 문자를 한가지 문자(→ 쉼표)로 강제 제한시켜버리고 (ex. 입력은 무조건 "23,47"로만 입력이 되도록)

결과도 그와 같은 형태로 출력해주자

 

이런 생각으로 구분 문자를 변경하는 법도 공부했지만..

(2021.11.30 - [2. 개발 공부/Java] - [Java 공부] Scanner 클래스의 useDelimiter 메소드를 이용해서 구분자를 쉼표로 변경해보기)

 

 

결과적으로 초급 레벨에서 그렇게까지 원하는건 아닐거라고 정신승리(..)하며 구현하기를 포기했다.

나중에 기회가 된다면 꼭 이 부분을 해결해보고 싶다.

 

 

그리고, if문 안에 if문을 중첩해서 넣지 않고 아래와 같이 코드를 써보기도 했는데

...
    void changeTime() {
		if(minute >= 45)
			minute -= 45;
		else if (minute < 45 && hour == 0) {
			hour = 23;
			minute += 15;
		}
		else {
			hour--;
			minute += 15;
		}
	}	
....

더 빠르게 결과를 출력해줄 것이라 생각했는데 오히려 가장 늦게 처리가 되었다.


사담이지만 개인적으로 이 알람 방법을 사용해봤다.

하지만 뇌라는게 참 똑똑하게도.. 그 아침에도 '45분 일찍 알람을 맞춰다는 사실'을 기억하고 있어서 더 많이 잤다는 기분이 들지는 않았다.

 

Comments