문제
문제: KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다.
또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.
훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.
입력: 첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.
출력: 첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)
예제 입력: 14 30 또는 17 40 또는 23 48
20 80 25
예제 출력: 14 50 또는 19 0 또는 0 13
풀이 해석💬
1. 공통 해석✅
- 줄바꿈을 기준으로 나눈 다음에 input변수에 저장하고, 저장된 배열의 첫번째 인덱스는 다시 띄어쓰기를 기준으로 나누어 a(시)와 b(분)로 분리한다.
- 두번째 인덱스는 c(추가할 분)에 숫자로 변환하여 저장한다.
풀이🆗
1. 정답코드들과 해석
- 정답 코드1️⃣(내가 생각한 로직)
const fs = require('fs');
const input = fs.readFileSync(0).toString().trim().split("\n");
const [a, b] = input[0].trim().split(" ").map(Number);
const c = Number(input[1]);
if (b + c < 60) {
console.log(a, b + c);
} else {
const d = (a + Math.floor((b + c) / 60)) % 24;
console.log(d, (b + c) % 60);
}
해석✅
2. b(분)+c(추가할 분) < 60
- b와c를 더하여 60분이 넘는지를 조건문의 기준으로 한다.
- 만약 60분 미만이라면 a(시간) 변경이 필요 없다.
3. 60분을 초과★
- 시간 변경이 필요하므로 새로운 변수 d에 저장한다.
- Math.floor()를 사용하여 소수점 이하는 생략하게하고 %로 나머지를 사용하여 24시간을 초과하면 자동으로 0~23의 범위로 맞춘다.
- 정답 코드2️⃣(조건문 없이 const만 사용한 코드)
const fs = require('fs');
const input = fs.readFileSync(0, "utf-8").trim().split("\n");
const [a, b] = input[0].trim().split(" ").map(Number);
const c = Number(input[1]);
const totalMinutes = b + c;
const newHours = (a + Math.floor(totalMinutes / 60)) % 24;
const newMinutes = totalMinutes % 60;
console.log(newHours, newMinutes);
해석✅
2. b+c를 바로 계산
- b와 c를 바로 계산해서 totalMinutes에 저장한다.
3. a(시간) 계산★
- Math.floor()를 사용하여 소수점 이하는 생략하게하고 %로 나머지를 사용하여 24시간을 초과하면 자동으로 0~23의 범위로 맞춘다.
4. b(분) 계산
- totalMinutes에서 60을 나눈 나머지를 그대로 사용한다.
장점
1. 계산을 즉시 수행하여 불필요한 변수 생성을 최소화한다.
2. 코드가 더 간결하고 가독성이 높아진다.
- 정답 코드3️⃣( let 사용 )
const fs = require('fs');
const input = fs.readFileSync(0, "utf-8").trim().split("\n");
let [a, b] = input[0].trim().split(" ").map(Number);
let c = Number(input[1]);
b += c;
a += Math.floor(b / 60);
b %= 60;
if (a >= 24) {
a -= 24;
}
console.log(a, b);
해석✅
2. 분(b)에 추가할 분(c)더하기
- 'b+=c'는 'b = b+c' 와 같은 수식이다.
- b에 c를 더하여 총 분을 구한다.
3. 60분을 초과하면 시(a) 증가
- a+=Math.floor(b/60); 은 a를 60으로 나눈 몫을 a에 더한다음 저장한다는 의미이다.
- b%= 60; 은 b를 60으로 나눈 나머지를 다시 b에 저장한다는 의미이다.
4. 24시가 되면 0시로 변환
- if(a>=24){a-=24;}는 24시 형식을 맞추기 위해 a가 24보다 크거나 같으면 a-24한 값을 a에 저장한다는 의미이다.
더 알아보기❗
- 2884번 문제와 비슷한 유형의 문제였지만 이번에도 let이 아닌 const로 풀었다.
- 아직까지는 const가 손에 익어서 그런것같다. 앞으로는 값의 변경 유무를 살핀 다음 let이나 const를 적절히 사용해가면서 코드를 작성해봐야겠다.
- 조건문이라서 if~else문을 사용하는게 백준의 의도였겠지만 조건문없이 const만 사용해서 정답을 푸는것도 시야에서 벗어난 풀이라서 간결하고 이해가 잘 되는 코드로 느껴졌다.
- 자양분이 된 코드
// 시도한 코드 1
if(b+c<=60){
console.log(a,b+c);
}else if(b+c>=120){
console.log(2);
console.log(a+2,(b+c)%60);
}else{
console.log(3);
if(a===23){
console.log(0, (b+c)%60);
}else{
console.log(a,(b+c)%60);
}
}
// 시도한 코드 2
if(b+c<60){
console.log(a,b+c);
}else{
const d = a + Math.floor((b+c)/60);
if(d===24){
console.log(0,(b+c)%60);
}else if(d>24){
console.log(d-24,(b+c)%60);
}else{
console.log(d, (b+c)%60);
}
}
'알고리즘 Node.js' 카테고리의 다른 글
백준 2739문제. 구구단(3단계 시작) (0) | 2025.03.01 |
---|---|
백준 2480문제. 주사위 세개 (0) | 2025.02.28 |
백준 2884문제. 알람 시계 (0) | 2025.02.27 |
백준 14681문제. 사분면 고르기 (0) | 2025.02.27 |
백준 2753문제. 윤년 (0) | 2025.02.26 |