문제
문제: 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.
이런 상근이를 불쌍하게 보던 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 "45분 일찍 알람 설정하기"이다.
이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.
입력: 첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 알람 시간 H시 M분을 의미한다.
입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
출력: 첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)
예제 입력: 10 10 또는 0 30 또는 23 40
예제 출력: 9 25 또는 23 45 또는 22 55
풀이
const fs = require('fs');
const input = fs.readFileSync(0).toString().trim().split(" ");
const a = parseInt(input[0]);
const b = parseInt(input[1]);
if(b-45>=0){
console.log(a,b-45);
}else{
if(a===0){
console.log(23,b+15)
}else{
console.log(a-1,b+15);
}
}
풀이 해석
1. const를 사용한 풀이
- if(b-45>=0)
- 분-45가 0보다 크거나 같으면 a의 시는 그대로 출력하고, b의 분은 b-45를 해서 출력한다.
- else{ if(a===0)
- 0시일때 예외처리를 한다. 그래서 a가 0일 때 23을 출력한다.
- b-45가 0보다 크면 b가 음수가 되므로 60분을 더해줘야함. b-60-45를 해야하지만 60-45=15이기에 +15를 바로 해주었다.
- else{else{
- 그 외에는 a-1을 해서 1시간을 빼준다.
더 알아보기
1. 또 다른 풀이(let 사용)
const fs = require('fs');
const input = fs.readFileSync(0, "utf-8").trim().split(" ");
let a = Number(input[0]);
let b = Number(input[1]);
if (b >= 45) {
b -= 45;
} else {
b += 15;
if (a === 0) {
a = 23;
} else {
a -= 1;
}
}
console.log(a, b);
1. fs.readFileSync(0, "utf-8")
- 백준에서 안전하게 입력을 받는 방식이다.
2. .trim().split(" ")
- 공백을 기준으로 a(시)와 b(분)을 나눠서 배열로 저장한다.
3. 45분 빼기
- if(b>=45){ b-=45; }
- b가 45보다 크거나 같으면 b에서 45를 빼서 다시 b에 저장한다.
4. b<45 이면 시를 조정
- else{ b+=15;
- b가 45보다 작으면 b에서 15를 더해서 다시 b에 저장한다.
- 예를 들어 10 30 일 때, 30-45는 -15가 되어서 음수가 발생하므로 60분을 더해서 조정한다.
- 따라서 b = b + 60 - 45 가 되므로 b+15로 변환하여 적을 수 있다.
5. 시(a) 조정
- if(a===0){a=23;}
else{a-=1};
- a가 0이면 23시로 바꿔야한다.
- 그 외에는 a에서 1을 빼서 다시 a에 저장한다.
6. 출력
- 저장된 a와 b를 출력한다.
- console.log(a, b)
2. let을 사용한 코드가 더 좋은 이유
1. let을 사용하면 값 변경이 가능해서 b-=45, a-=1같은 연산이 깔끔하게 수행된다.
2. const를 고집할 필요는 없다.
- 변하지 않는 값은 const가 맞지만
- a와 b처럼 값이 변할 수 있다면 let을 사용해야 맞다.
'알고리즘 Node.js' 카테고리의 다른 글
백준 2480문제. 주사위 세개 (0) | 2025.02.28 |
---|---|
백준 2525문제. 오븐 시계 (0) | 2025.02.28 |
백준 14681문제. 사분면 고르기 (0) | 2025.02.27 |
백준 2753문제. 윤년 (0) | 2025.02.26 |
백준 9498문제. 시험 성적 (0) | 2025.02.26 |