흙금이네 블로그

[BOJ] 18312 - 시각 (Python, JavaScript) 본문

알고리즘

[BOJ] 18312 - 시각 (Python, JavaScript)

흙금 2023. 1. 31. 03:53

 

 

아이디어

 

규칙을 찾아 간단하게 계산할 수 있는 부분은 계산하여 처리하고, 나머지는 브루트포스로 처리한다.

 

 

풀이 #1 (Python)

 

한 자릿수 앞에는 0이 붙으며, 00부터 59까지의 수에서 0~5는 15번씩, 6~9는 6번씩 등장한다.

K가 등장하는 횟수를 m이라 한다면 00분 00초부터 59분 59초까지 K가 등장하는 총 횟수 x는

초와 상관없이 분에서 K가 등장하는 횟수와 분과 상관없이 초에서 K가 등장하는 횟수의 합(m×60×2)에서

분과 초에서 동시에 K가 등장하는 횟수(m^2)를 빼서 K가 0~5일 때는 1575, K가 6~9일 때는 684가 된다.

 

시에 대해서는 계산식을 세우는 것이 더 복잡할 것 같아 for문에서 문자열로 K의 포함 여부를 확인하도록 한다.

만약 시에서 K가 등장하면 분과 초에 상관없이 60×60인 3600번 등장하는 것이므로, 3600에서 x를 뺀 나머지를 더한다.

 

N, K = map(int, input().split())
x = 1575 if K < 6 else 684
res = x*(N+1)
for i in range(N+1):
    if f'{K}' in f'{i}'.zfill(2):
        res += 3600-x
print(res)

 

 

 

풀이 #2 (JavaScript)

 

풀이 #1과 같은 방식으로 동작한다.

padStart 메서드로 문자열 앞에 0을 채우고, includes 메서드로 K의 포함 여부를 확인한다.

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString();

let [N, K] = input.split(' ').map(Number);
let x = K < 6 ? 1575 : 684;
let res = x*(N+1);
for (let i=0; i<N+1; i++) {
    if (String(i).padStart(2, 0).includes(K)) res += 3600-x;
}
console.log(res);

 

Comments