[백준][ts/js] 1259번 팰린드롬수

Pyotato·2023년 6월 29일
0

[백준][js/ts]

목록 보기
18/21
post-thumbnail

문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

출력

각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.

로직

logic

  • 입력값은 개수가 명시되지 않았다. 대신 마지막 줄에 0인 경우 입력값을 그만 받음.
  • 숫자타입으로 형변환해줬을 때 0이면 while문을 false로 해서 입력값을 그만 받는다.
  • 팰린드롬수지만 팰린드롬인지 여부만 확인하면 되는 문제이므로 굳이 string타입으로 형변환해줄 필요는 없다.
  • for .. of 문을 돌면서 list 배열에 담아서 list를 reverse해준 다음 join 해줘서
  • 입력 string과 동일하면 "true"출력 아니면 "false"출력해준다.

후기

while문으로 입력값을 계속 받다가 false로 변경해줘야한다는 점이 조금 까다로웠다.

풀이

{
  const error_msg = () => {
    console.log("입력값이 부적절합니다.");
  };
  while (true) {
    const num: string | null = prompt("숫자를 입력해주세요.");
    if (num) {
      if (parseInt(num) === 0) {
        break;
      }
      const temp: Array<string> = [];
      for (let i of num) {
        temp.push(i);
      }
      temp.reverse();
      const cmp: string = temp.join("");
      cmp == num ? console.log("yes") : console.log("no");
      continue;
    } else {
      error_msg();
      break;
    }
  }
}
/*
test1

input
121
1231
12421
0

output
yes
no
yes

----

test2

input
1 10

output
3

----

test3

input
5324 894739

output
183

*/
  • 입력값 에러처리
{
  const input :null | string= prompt("숫자 A B를 입력해주세요.");
  const invalid_input=()=>{console.log("입력값이 부적절합니다.")};
  if (!input) {
    invalid_input();
  } else {
        const [A, B]: Array<number> = input.split(" ").map((v) => typeof v==="number"? parseInt(v): -1);
        if(A || B){
            invalid_input();
        } else{
           const dv: number = Math.ceil(Math.sqrt(B));

            const primes: Array<boolean> = new Array(dv + 1).fill(true);
            primes[1] = false; //1은 소수가 아니다.
            for (let i = 2; i < dv + 1; i++) {
            //소수 계산
            if (primes[i]) {
                if (i * i > dv) {
                break;
                }
                for (let j = Math.pow(i, 2); j < dv + 1; j += i) {
                primes[j] = false;
                }
            }
            }

            let cnt: number = 0;
            for (let i = 1; i < primes.length; i++) {
            if (primes[i]) {
                let result = i * i;
                while (true) {
                if (result < A) {
                    result *= i;
                    continue;
                }
                if (result > B) {
                    break;
                }
                result *= i;
                cnt += 1;
                }
            }
            }
            console.log(cnt); 
        }
        
    }
    
}
profile
https://pyotato-dev.tistory.com/ 로 이사중 🚚💨🚛💨🚚💨

0개의 댓글