군대에서_코딩하기_알고리즘_6

신태원·2021년 5월 12일
0

군대에서_코딩하기

목록 보기
7/30
post-thumbnail

오늘 문제는 자연수 N을 받아서, 뒤집은 다음에 소수인지 판별하는 문제였다. 근데 만약 N을 뒤집었을 때 0이 앞에 오면, 그 0은 제외하고 숫자 조합.
예를 들어 5400이면 뒤집었을 때 0045니까, 45로 판별해서 딱 소수들만 출력하기였다.
어려운 문제는 아니었지만, 그래도 런타임을 생각해서, 자연수 N을 받았을 때, 일일히 1부터 N까지 다 돌면서 나머지가 0임을 확인하는것보다, N의 제곱근을 구해서 1부터 N의 제곱근까지 for문을 돌려줬다.

우선 코드는 아래와 같다.

#include<iostream>
#include<cmath>

using namespace std;

int reverse(int orgin_num){
    int num = orgin_num;
    int sum=0, size=0,cnt=0 ;
    
    while(num>0){
        num = num/10;
        size++;
    }
    
    while(orgin_num>0){
        if(cnt==0 && orgin_num%10==0){
            size--;
            orgin_num = orgin_num / 10;
            continue;
        }
        else if(cnt==0 && orgin_num%10!=0){
            cnt++;
            sum = sum + (orgin_num%10)*pow(10, size-1);
            size--;
            orgin_num = orgin_num / 10;
        }
        else if(cnt==1){
            sum = sum + (orgin_num%10)*pow(10, size-1);
            size--;
            orgin_num = orgin_num / 10;
            
        }
        
    }
    
    return sum;
}

bool isPrime(int x){
    
    int x_sqrt = (int)sqrt(x);
    int check=0;
    for(int i=2; i< x_sqrt; i++){
        
        if(x%i==0){
            check++;
            break;
        }
    }
    
    if(check==1){
        
    }
    else{
        cout<<x<<" ";
    }
}

int main(){
    
    int N,i, num, res;

    
    cin>>N;
    
    for(i=0; i<N; i++){
        cin>>num;
        
        res = reverse(num);
        if(res==1){
            continue;
        }
        else{ isPrime(res);}
            
    }
    
    //cout<<(int)sqrt(N);
    
    //cout<<reverse(N);
    
}

살짝,,아니 많이 아쉬운 부분은, reverse 함수 부분인데,

int reverse(int orgin_num){
    int num = orgin_num;
    int sum=0, size=0,cnt=0 ;
    
    while(num>0){
        num = num/10;
        size++;
    }
    
    while(orgin_num>0){
        if(cnt==0 && orgin_num%10==0){
            size--;
            orgin_num = orgin_num / 10;
            continue;
        }
        else if(cnt==0 && orgin_num%10!=0){
            cnt++;
            sum = sum + (orgin_num%10)*pow(10, size-1);
            size--;
            orgin_num = orgin_num / 10;
        }
        else if(cnt==1){
            sum = sum + (orgin_num%10)*pow(10, size-1);
            size--;
            orgin_num = orgin_num / 10;
            
        }
        
    }

너무 복잡하게 생각했다. 저번부터, 같은 메카니즘으로 더 쉽고 간단명료한 코드를 분명 배웠는데, 계속 같은 실수를 반복한다..

int reverse(int x){
	int res=0, tmp;
	while(x>0){
		tmp=x%10;
		res=res*10+tmp;
		x=x/10;
	}
	return res;
}

이런식으로하면 끝날것을.. 이상한 int형 변수를 선언해서 끝에가 0인지 확인을 하고,, 그리고 자연수 N의 사이즈를 재주는.. 이상한 방식을 택했다.. 특히 res=res*10+tmp; 이부분은 예전에도 꼭 숙지해야겠다고 생각한 부분이었는데,, 다음번에는 반드시..

profile
일단 배우는거만 정리해보자 차근차근,,

0개의 댓글