4-2) 뒤집은 소수

김예지·2021년 8월 27일
0

문제

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하 는 프로그램을 작성하세요. 예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출 력한다. 단 910를 뒤집으면 19로 숫자화 해야 한다. 첫 자리부터의 연속된 0은 무시한다.
[입력설명]
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다. 각 자연수의 크기는 100,000를 넘지 않는다.
[출력설명]
첫 줄에 뒤집은 소수를 출력합니다. 출력순서는 입력된 순서대로 출력합니다.

입력예제 1

9
32 55 62 20 250 370 200 30 100

출력예제 1

23 2 73 2 3


문제 풀이

예습 이론

  • 소수: 1과 자기자신만 약수인 수, 1은 소수가 아니다
  • 내장함수 reverse를 사용하지 않고 수를 뒤집는 방법
<script>
while(x){
	let t=x%10; //1의 자리
	res=res*10+t; 
	x=parseInt(x/10); //Math.floor도 됨. 여기서 parseInt는 몫만 나타내기 위해 사용(몫만 나타내려면 Math.floor, parseInt 사용가능)
}
</script>
  • Math.sqrt(num): num의 제곱근 (16-4)
  • parseInt, Math.floor은 소수점을 삭제한다. (몫만 나타내야 할 때, 반드시 사용해줄 것! 앞장 참고)
  • Number(x.toString().split('').reverse().join('')): x를 문자열로 바꾸고, 문자열을 쪼개서 배열로 만든다. 그 이후 배열을 뒤집고, join한다. 문자열을 Number화한다.

코드1

코드1은 reverse 내장함수를 사용하지 않은 방법이다.
(1) for x of arr
(2) x를 뒤집는다.
(3) 뒤집은 변수 res가 소수가 되는지 판별한다(소수 판별 함수를 따로 만든다.)

<!--방법1-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
                //소수인지 확인하는 함수(소수: 1과 자기자신만 약수인 수)
                function isPrime(num){
                  if(num===1) return false; //소수에서 1 제외
                  //parseInt를 사용해서 몫만 나타냄(나머지 삭제)
                  for(let i=2; i<=parseInt(Math.sqrt(num)); i++){
                      if(num%i===0) return false; //소수가 아님
                  }
                  return true;
                }
                function solution(arr){
                    let answer=[]; //답 여러개 리턴되니까, 배열로 만들어줌
                    for(let x of arr){
                    let res=0; //소수가 출력되니까, 원본 필요없음
                    //뒤집어짐
                    while(x){
                        let t=x%10; //1의 자리
                        res=res*10+t; 
                        x=parseInt(x/10); //Math.floor도 됨. 여기서 parseInt는 몫만 나타내기 위해 사용(몫만 나타내려면 Math.floor, parseInt 사용가능)
                    }
                    if(isPrime(res)) answer.push(res);
                }
                return answer;
            }
            
            let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
            console.log(solution(arr));
        </script>
    </body>
</html>

코드2

코드2는 reverse 메소드를 활용하여 뒤집는 방법이다.
(1) let x of arr
(2) Number(x.toString().split('').reverse().join(''));을 통해 x를 뒤집은 값을 res에 넣는다.
(3) res가 소수인지 판별한다(별도 함수)

<!-- 방법2) reverse 메소드 사용 -->
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function isPrime(num){
                if(num===1) return false;
                for(let i=2; i<=parseInt(Math.sqrt(num)); i++){
                    if(num%i===0) return false;
                }
                return true;
            }
            function solution(arr){
                let answer=[];
                for(let x of arr){
                    let res=Number(x.toString().split('').reverse().join(''));
                    if(isPrime(res)) answer.push(res);
                }
                return answer;
            }
            
            let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
            console.log(solution(arr));
        </script>
    </body>
</html>
profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

2개의 댓글

comment-user-thumbnail
2021년 9월 11일

9/11
1. i<=parseInt(Math.sqrt(num)) (i<=parseInt(num/2)) 사용해서 코드 효율성 높이자 (굳이 탐색하지 않아도 되는곳까지 탐색하지 말것)
2. 내장함수 reverse 사용하지 않고 숫자 뒤집는 방법 기억

답글 달기
comment-user-thumbnail
2021년 9월 13일

9/13
문자 001을 숫자로 변형하면 1이된다. (즉, 앞에있는 0이 숫자형에서 자동적으로 삭제된다)

답글 달기