반응형

친구의 과제를 도와주다가 씨플플에서 문자를 정수로 char를 int로 바꿔야할 일이 생겼다.

예전에 씨플플로 알고리즘을 조금 풀었을 때 자주 썼던 방법인데 기억이 안나서 정리를 해두려고 한다.

 

C++에서 문자를 정수로, 정수를 문자로 바꾸기

아주 간단하다 문자를 정수로 바꿀 경우 -'0'을 해주고 정수를 문자로 바꿀 경우 +'0'을 해주면 된다.

int main(){
    char test = '1'; // 문자 1
    int intTest = test - '0'; // 숫자 1
    
    int test2 = '2'; // 숫자 2
    char charTest2 = '2' + '0'; // 문자 2
    
    return 0;
}

요런식..!

과제의 내용

우선 과제의 문제는 1부터 50까지의 369를 출력하는데 3, 6, 9는 *로 대체하는 문제이다. 33 처럼 두개가 해당하면 **로 대체한다.

출력 예시는 아래와 같다.

1 2 * 4 5 * 7 8 * 10 
11 12 * 14 15 * 17 18 * 20 
21 22 * 24 25 * 27 28 * * 
* * ** * * ** * * ** 40 
41 42 * 44 45 * 47 48 * 50

내가 쓴 코드

#include <iostream>
using namespace std;
int main() {
    for (int i = 1; i <= 50; i++) {
        // 1자리 수일 때
        if (i <= 10){
            if (i % 3 == 0) cout << "*" << " ";
            else cout << i << " ";
        }
        // 2자리 수일 때
        else{
            string x = to_string(i);
            int fir = x[0] -'0';
            int sec = x[1] - '0';

            // 1번째 자리 혹은 2번째 자리에 3의 배수가 존재한다면 0이 아닐 때
            int cnt = 0;
            if (fir != 0 && fir % 3 == 0) cnt++;
            if (sec != 0 && sec %3 == 0) cnt++;

            if (cnt > 0) {
                for (int j = 0; j < cnt; j++) cout << "*";
                cout << " ";
            }
            else cout << i << " ";

        }
        if (i % 10 == 0) cout << "\n";
    }
    return 0;
}

굉장히 비효율적으로 작성한 것 같다 기능 구현에만 급급해서... 문자열 관련 알고리즘을 많이 풀어서 그런지 문자열로 접근을 했다... 2자리 수면 문자열로 전환 후 그 문자열을 인덱스로 나눠 각각의 문자로 바꾸고 다시 정수로 바꾸어 준 후 생각했다. 

작성한 코드를 다시보니 정말... 충분히 더 압축할 수 있을 것 같은데...머저리 같은 코드이지만... 처음 작성한 그대로를 올렸다!

친구가 보낸 정답 코드

#include <stdio.h>

int main() {
    int N = 50, cnt = 0;
    for (int n = 1; n <= N; n++) {
        int ten = n / 10;
        int one = n % 10;
        if (((ten != 0) && (ten % 3 == 0)) || ((one != 0) && (one % 3 == 0))) {
            printf("  *");
            if (((ten != 0) && (ten % 3 == 0)) && ((one != 0) && (one % 3 == 0))) {
                printf("*");
                cnt++;
            }
        }
        else {
            printf(" %3d", n);
        }
        if (n % 10 == 0) printf("\n");
    }
    return 0;
}

친구가 보낸 정답 코드는 주어진 수를 10으로 나누어 몫, 나머지로 자릿수를 구분했다... 이게 훨씬 효율적인 것 같은데 

 

반성...

분명히 예전에도 이렇게 자릿수를 몫과 나머지로 구분해서 풀 수 있다고 몇 번 느꼈던 것 같은데 문제를 보자마자 문자열로 접근해 버렸다... 알고리즘 문제들이 문자열 관련 구현문제들이 많아서 나쁜 버릇은 아닐 것이라고 생각되는데 그래도 조금 더 효율적으로 접근하고 구현했으면 어떨까 하는 생각이 든다. 흐음... 스스로에게 조금 실망스럽다... 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기