https://www.acmicpc.net/problem/1942
코드
const fs = require("fs");
const filePath = process.platform === "linux" ? "dev/stdin" : "./input.txt";
const arr = fs.readFileSync(filePath).toString().trim().split("\n");
arr.forEach((item) => {
let ans = 0;
let [start, end] = item.split(" ");
start = start.split(":").map((item) => +item);
end = end.split(":").map((item) => +item);
while (true) {
// 3의 배수인지?
let num = +start
.map((item) => {
if (item < 10) return "0" + item;
else return item.toString();
})
.join("");
if (num % 3 === 0) ans++;
// 시간이 흘러 end까지 도달했는지
let is_end = true;
for (let i = 0; i < 3; i++) {
if (start[i] !== end[i]) {
is_end = false;
break;
}
}
if (is_end) break;
// 1초 증가
start[2]++;
if (start[2] === 60) {
start[1]++;
start[2] = 0;
}
if (start[1] === 60) {
start[0]++;
start[1] = 0;
}
if (start[0] === 24) {
start[0] = 0;
}
}
console.log(ans);
});
코드 설명
- 입력받은 시작 시간과 끝나는 시간을 ":" 기준으로 분리하여 숫자 배열로 만든 것을 각각 start와 end 변수에 저장한다.
- start와 end의 배열의 값들이 같은 인덱스에 있는 숫자끼리 동일해질 때까지 아래 과정을 반복한다.
- start [hh, mm, ss]에서 문제가 요구하는대로 만든 수 hhmmss가 3의 배수인지 확인한다. start의 각 숫자를 문자열로 만들어서 join한 뒤에 이 문자열을 + 연산자를 이용하여 숫자로 다시 바꿔준다. 주의할 점은 start의 각 숫자를 문자열로 만들 때, 10 미만의 수는 앞에 "0"을 붙여줘야 오류 없이 동작한다.
- 3의 배수가 맞다면 ans의 값을 1 증가시켜준다.
- start와 end 배열의 값 중 서로 같은 인덱스에 있는 숫자가 모두 동일한지 살펴본다. 만약 모두 같다면 while문을 탈출하면 된다.
- start를 1초 증가시킨다. 배열의 각 숫자들은 모두 시간을 나타내므로 분, 초는 60을 넘어갈 때, 시는 24를 넘어갈 때 처리를 해준다.
문제와 해결
- 자바스크립트는 연산하려는 두 피연산자의 타입이 다를 경우 암시적 형변환을 하기 때문에 start가 [03:09:01]일 때 이것을 각 요소를 문자열로 만들어서 바로 join하면 391이 되어버리는 일이 발생했다. 그래서 map 메서드를 이용하여 start[i]가 10보다 작다면 앞에 "0"을 붙이도록 수정했다.
- 3의 배수인지 확인하는 코드와 end까지 모두 탐색했는지 확인하는 코드의 위치가 처음에는 현재 코드의 반대였는데, 이렇게 하니 end에 해당하는 시간은 3의 배수인지 확인하지 않아서 틀리는 일이 있었다. 두 코드의 위치를 바꿔주니 해결할 수 있었다.
'문제풀이 > 문자열' 카테고리의 다른 글
[Javascript/자바스크립트] 백준 5648번 역원소 정렬 (0) | 2024.07.27 |
---|---|
[Javascript/자바스크립트] 구름 - 단어의 개수 세기 (0) | 2024.07.01 |
[Python/파이썬] 백준 14405번 피카츄 (0) | 2024.06.24 |
[Python/파이썬] 백준 5052번 전화번호 목록 (0) | 2024.03.25 |
[Python/파이썬] 백준 3613번 Java vs C++ (0) | 2024.03.16 |