🎮 오늘의 기술 키워드

  • C++: 자연수 각 자릿수의 합 구하기
  • 나눗셈( / ) & 나머지( % ) 연산
  • 자료형 변환 (int to string)

🌍 나만의 연결

프로그래밍 문제를 해결하는 것은 영화 시나리오를 기획하는 것과 비슷하다고 느꼈다. 오늘 해결한 '자릿수 합' 문제도 마찬가지다.

기획자의 관점에서 이 문제를 바라보면, "최소한의 자원으로 목표를 달성하는 최적의 방법은 무엇인가?"라는 질문을 던지게 된다.

  • 방법 1 (수학적 접근): N을 10으로 반복해서 나누는 방식은, 마치 시나리오에서 복잡한 사건을 가장 핵심적인 요소(일의 자리 숫자)부터 하나씩 분해해 나가는 것과 같다. 불필요한 장치(문자열 변환) 없이 가장 효율적인 방법으로 문제를 해결한다.
  • 방법 2 (문자열 접근): 정수를 문자열로 변환하는 방식은, 배우의 대사를 일일이 텍스트로 옮겨 적은 후 분석하는 것과 같다. 비록 추가적인 작업(변환)이 필요하지만, 가독성이 좋고 직관적으로 이해하기 쉽다는 장점이 있다.

두 방법 모두 정답이지만, 어떤 상황에서 더 효율적인지, 즉 어떤 배우와 어떤 장치(연산)를 선택할지는 기획자의 판단에 달렸다.


🧠 깨달음 & 질문

  • 깨달음: 같은 문제를 해결하는 데에도 여러 가지 방법이 있으며, 각 방법에는 장단점이 존재한다는 것을 다시 한번 깨달았다. 특히 수학적 연산(%, /)을 활용하는 것이 문자열 변환보다 더 빠르고 메모리를 적게 사용하는 경우가 많다는 점을 기억해야한다.
  • 질문: 그렇다면 큰 수(long long int)의 자릿수 합을 구하거나, 매우 빈번하게 호출되는 함수라면 어떤 방법을 선택해야 할까? 그리고 어떤 상황에서 문자열 변환 방식이 더 유용하게 쓰일 수 있을까?

🧵 연결 태그

#C++, #알고리즘, #자릿수합, #문제해결, #기획, #TIL


📌 오늘의 메모 한 줄

문제 해결의 핵심은 정답을 찾는 것뿐만 아니라, 가장 효율적인 경로를 찾는 것이다.


solution 함수 구현

C++
 
#include <iostream>

int solution(int n) {
    int answer = 0;
    std::string s = std::to_string(n); // 정수 n을 문자열로 변환
    for (char c : s) {
        answer += c - '0'; // 각 문자를 정수로 변환하여 더함
    }
    return answer;
}

풀이 과정 설명

 

방법 1: 문자열을 이용한 풀이

  1. 정수 → 문자열 변환: 먼저 주어진 정수 n을 std::to_string() 함수를 사용하여 문자열로 변환. 예를 들어 n이 123이면 "123"이 된다.
  2. 각 문자 순회: 이 문자열을 순회하면서 각 문자에 접근.
  3. 문자 → 정수 변환: 각 문자는 아스키 코드 값을 가지므로, '0'을 빼주면 해당 문자가 나타내는 숫자 값을 얻을 수 있다. 예를 들어 '1'은 아스키 코드 값 49이고 '0'은 48이므로 '1' - '0'은 49 - 48 = 1이 된다.
  4. 합산: 변환된 숫자 값을 answer 변수에 누적하여 더한다.

방법 2: 수학적 연산을 이용한 풀이

이 방법은 문자열 변환 없이 나머지 연산나눗셈 연산을 반복적으로 사용하는 방법이다.

#include <iostream>

int solution_math(int n) {
    int answer = 0;
    while (n > 0) {
        answer += n % 10; // n을 10으로 나눈 나머지를 더함 (가장 낮은 자리의 숫자)
        n /= 10;          // n을 10으로 나눔 (가장 낮은 자리의 숫자를 제거)
    }
    return answer;
}

이 방법은 문자열 변환 과정이 없어 더 효율적일 수 있다.

  1. 나머지 연산: n % 10은 n을 10으로 나눈 나머지를 반환한다. 이 값은 n의 가장 오른쪽(일의 자리) 숫자가 된다.
  2. 합산: 이 값을 answer에 더한다.
  3. 나눗셈 연산: n / 10은 n을 10으로 나눈 몫을 반환한다. 이 연산을 통해 가장 오른쪽 숫자를 제거할 수 있다.
  4. 반복: n이 0이 될 때까지 위 과정을 반복한다.