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

신태원·2021년 5월 3일
0

군대에서_코딩하기

목록 보기
2/30
post-thumbnail

자대에서 사지방 연등 일주일차..? 다. 저번에 업로드했던 글에서처럼 인프런에서 유료강의를 구매해 공부하고 있고, 현재 하루에 한문제씩 푸는것을 목표로 하고 있다. 지금은 기본적인것들이라 따로 정리나 업로드를 하고 있지 않지만, 오늘 문제를 풀며 뒷통수를 맞은듯한 기분이 들어서.. 글을 업로드한다..

우선 오늘 내가 푼 문제는 숫자가 섞인 문자열을 입력받았을 때, 숫자만 구분하고, 그 숫자를 합쳐서 그 숫자의 약수를 구하는 것이다.
예를 들면

t0e0a1c2her 에서 숫자만 추출하면 0, 1, 2 이다. 이때 맨앞의 0은 제외하기 때문에 12가 된다.
두번째 예시로 rgf0gqE5F40dgs 에서 숫자만 추출하면 0, 5, 4, 0 이다. 이때 맨앞의 0을 제외하고 540이 나온다.

우선 내가 짠 코드다.

#include<stdio.h>
#include<iostream>
#include <string.h>
#include<cmath>

using namespace std;

int main(){
    
    char mix[51]={0,};
    int num[11] ={0,}, cnt=0;
    
    scanf("%s", &mix);
    
    int len = strlen(mix);
    
    for(int i =0; i<len; i++){
        if(mix[i]<65){
            num[cnt] = mix[i] -'0';
            cnt++;
        }
    }
    
    int check = cnt;
    int fin=0;
    for(int i =0; i<cnt; i++){
        
        if(num[i]!=0){
            fin = fin + pow(10, check-1)*num[i];
            check = check -1 ;
        }
        else{
            check = check -1 ;
        }
        
      
    }
   int div_cnt=0;
   for(int i =1; i<=fin; i++){
       if(fin%i==0){
           div_cnt++;
       }
   }
    cout<<fin<<endl;
    cout<<div_cnt;
    
}

보이는것처럼 매우 더럽다.. 포문도 여러번 들어가있고, 특히 숫자를 추출하고 그것을 다시 한 숫자로 조합하는 과정에서 너무 번거로운 방법을 택했다..
문제풀이 강의를 보고 '진짜 나는 멍청하구나..'라는 생각을 했다..

for(int i =0; i<cnt; i++){
        
        if(num[i]!=0){
            fin = fin + pow(10, check-1)*num[i];
            check = check -1 ;
        }
        else{
            check = check -1 ;
        }
        
      
    }

위의 코드처럼 포문을 돌려서 맨앞에 0이 아닐때만 pow 함수를 써서 숫자를 조합하는 방법을 택했는데 그냥

for(i=0; a[i]!='\0'; i++){
	if(a[i]>=48 && a[i]<=57){
		res=res*10+(a[i]-48);
	}
}

이런식으로 한번에 아스키 코드 값을 설정해주고, 숫자만 바로 뽑아서 0이 아닌지 맞는지 구분할 필요없이 계속해서 10을 곱해주면서 숫자를 조합하면, 깔끔하게 해결된다..

코드는 최대한 간결하게,, 똑똑하게 짤것..

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

0개의 댓글