🎮 오늘의 기술 키워드
- 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: 문자열을 이용한 풀이
- 정수 → 문자열 변환: 먼저 주어진 정수 n을 std::to_string() 함수를 사용하여 문자열로 변환. 예를 들어 n이 123이면 "123"이 된다.
- 각 문자 순회: 이 문자열을 순회하면서 각 문자에 접근.
- 문자 → 정수 변환: 각 문자는 아스키 코드 값을 가지므로, '0'을 빼주면 해당 문자가 나타내는 숫자 값을 얻을 수 있다. 예를 들어 '1'은 아스키 코드 값 49이고 '0'은 48이므로 '1' - '0'은 49 - 48 = 1이 된다.
- 합산: 변환된 숫자 값을 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;
}
이 방법은 문자열 변환 과정이 없어 더 효율적일 수 있다.
- 나머지 연산: n % 10은 n을 10으로 나눈 나머지를 반환한다. 이 값은 n의 가장 오른쪽(일의 자리) 숫자가 된다.
- 합산: 이 값을 answer에 더한다.
- 나눗셈 연산: n / 10은 n을 10으로 나눈 몫을 반환한다. 이 연산을 통해 가장 오른쪽 숫자를 제거할 수 있다.
- 반복: n이 0이 될 때까지 위 과정을 반복한다.
'C++' 카테고리의 다른 글
| [TIL_C++] 템플릿과 STL (1) | 2025.08.28 |
|---|---|
| [TIL_C++] 자원관리(스마트포인터)/리플렉션 (1) | 2025.08.26 |
| [TIL_C++]주어진 단어를 회전시켜 단어를 만들기 (2) | 2025.08.25 |
| [TIL_C++] OOP와 전직시스템 구현 과제 느낀점 (3) | 2025.08.22 |
| [TIL_C] 클래스 (0) | 2025.08.21 |