단어에 숫자가 숨어있다. 이 숫자를 히든 넘버라고 한다. 알파벳 대/소문자와 숫자로 이루어진 단어가 주어졌을 때, 모든 히든 넘버의 합을 구하는 프로그램을 작성하시오.
단어와 히든 넘버는 아래와 같은 성질을 갖는다.
첫째 줄에 단어의 길이 n (1 ≤ n ≤ 5,000,000)이 주어진다. 둘째 줄에는 단어가 주어진다. 단어는 알파벳 대/소문자와 숫자(0-9)로 이루어져 있다.
입력으로 주어진 단어에 숨어있는 모든 히든 넘버의 합을 출력한다. 만약, 히든 넘버가 없는 경우에는 0을 출력한다.
파이썬으로 for문 돌렸을 때 입력값이 너무 커져서 시간초과가 날 수 밖에 없는 상황.
대신 입력값을 뒤에서부터 돌면서 숫자라면 일의 자리로, 다음 숫자가 온다면 그 숫자를 10의 자릿수로 이어주고 더해주는 식으로 접근.
구조분해를 사용해서 간단하게 자릿수,정답,일시적으로 히든 숫자들을 담을 변수를 선언해봤는데 더 깔끔해서 보기 좋은 것 같다.
{
const error_msg = (input: string | null) => {
input
? console.log(`${input}은 부적절한 입력값입니다.`)
: console.log("값을 입력해주세요.");
};
const n: string | null = prompt(
"1 ≤ n ≤ 5,000,000인 단어 길이 n을 입력해주세요."
);
const nums: Array<number> = new Array(9).fill(0);
nums.map((idx, v) => (nums[idx + 1] = idx + 1)); //[0,1,2,3,4,5,6,7,8,9]
if (n) {
const word: string | null = prompt(`길이가 ${n}인 단어를 입력해주세요.`);
if (word) {
if (word.length === parseInt(n)) {
let [place_value, ans, temp]: Array<number> = [1, 0, 0];
for (let i = parseInt(n) - 1; i >= 0; i--) {
//배열 뒤에서부터 item 확인
// console.log(word[i]);
if (nums.includes(parseInt(word[i]))) {
temp += parseInt(word[i]) * place_value;
place_value = place_value * 10;
}
if (i === 0 || !nums.includes(parseInt(word[i]))) { //맨앞에서부터 숫자가 시작하거나 숫자가 아닌 경우
if (place_value >= Math.pow(10, 7)) {
place_value = 1;
temp = 0;
continue;
}
ans += temp;
place_value = 1;
temp = 0;
}
}
console.log(ans);
} else {
error_msg(word);
}
} else {
error_msg(word);
}
} else {
error_msg(n);
}
}
/*
test
input
14
ab13c9d07jeden
output
29
*/