https://www.acmicpc.net/problem/2577

조금은 애를 먹었던 문제이다.. c++에서 int형과 string 변수를 변환하여 사용하는 연습문제로 활용하기 엄청 좋은 문제인 것 같다.
어떤 로직으로 솔루션을 풀었는지보다, 어떻게 코딩하였는지를 설명하는게 좋을 것 같아 기존 포스팅과 다르게 먼저 솔루션을 공개하자면,
#include <iostream>
#include <string>
using namespace std;
int main(){
int a, b, c;
// 연산 결과가 int 범위를 초과할 수 있기 때문에, 연산 결과 변수는 long 으로 선언.
int result;
cin >> a >> b >> c;
result = a * b * c;
//숫자 등장 count용 배열 arr 선언 및 초기화.
int arr[10] = {0, };
// 반복문을 돌기 위해 result를 string 형으로 바꿈.
string s;
s = to_string(result);
for(int i = 0; i < 10; i++){
for(int j = 0; j < s.length(); j++){
if(s[j] - '0' == i){
arr[i]++;
}
}
}
for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){
cout << arr[i] << '\n';
}
return 0;
}
위와 같다. 특이한점은 기존 문제들과는 다르게, 2중 for문을 사용했다는 점과 지금까지 백준을 풀며 학습했던 유용한 함수들과 코딩 방법을 모두 활용할 수 있어서 좋았다.
문제자체는 어렵지 않아, 문제를 읽고 주의해야 했었던 것 + 내가 실수했던 것을 바탕으로 정리하자면,
해당 자릿수를 반복하며, 0 ~ 9 사이의 숫자를 몇개 포함하고 있는지 count해야했기 때문에, string 변수로 변환하여 사용하였다.
(많은 문제에서 활용한 방법이지만 또 까먹고 말았다..)
예를들어, s = '12345' 일때, s[0] = 1 이다. 그래서 char -> int 변환 시, (int)(s[0])처럼 캐스팅을 해주었는데 잘못된 방법이었다..
일단 값을 출력해보면, s[0]는 '1'로 출력되고 (int)(s[0])는 '49'로 출력된다. 그 이유는, 문자 '1'은 ASCII 코드에서 49에 해당한다. C++에서 문자는 내부적으로 ASCII 코드와 연관되어 있으며, 문자를 정수로 변환하면 해당 문자의 ASCII 코드가 반환되었기 때문이다. 따라서 s[0]는 문자 '1'을 (int)(s[0])는 이 문자의 ASCII 코드인 49가 출력되는는 것이다.
결론적으로, s[0] - '0' 를 사용하여, s[0]에서 문자 '0'의 ASCII 코드를 빼서 숫자 1을 얻어야 한다.
두 가지의 2중 for문이 있다. s = "1223334444"라고 가정할 때,
1번)
for(int i = 0; i < s.length(); i++){ for(int j = 0; j < 10; j++){ if(s[j] - '0' == i){ arr[i]++; } } }arr[0]에는 1이 저장. (위치 0에서 1이 1번 나타남)
arr[1]에는 2가 저장. (위치 1에서 2가 1번 나타남, 위치 3에서 2가 1번 나타남)
arr[2]에는 0이 저장. (2가 나타나지 않음)
arr[3]에는 0이 저장. (3이 나타나지 않음)
나머지 arr 원소는 모두 0으로 초기화.2번)
for(int i = 0; i < 10; i++){ for(int j = 0; j < s.length(); j++){ if(s[j] - '0' == i){ arr[i]++; } } }arr[0]에는 0이 저장. (0이 나타나지 않음)
arr[1]에는 2가 저장. (1이 2번 나타남)
arr[2]에는 3이 저장. (2가 3번 나타남)
arr[3]에는 4이 저장. (3이 4번 나타남)
나머지 arr 원소는 모두 0으로 초기화.결론은 2번 방법이 옳은 방법이다. 1번은 문자열 s를 순회하면서 위치 i를 확인하지만, 2번은 i를 0부터 9까지 증가시키면서 문자열 s를 순회하는 반복문이다. (이해가 되지 않는다면, A4용지에 반복문 한 싸이클의 결과를 천천히 적어나가면 된다.)
많이 헷갈렸다. size_of를 써야하는지 arr.sizeof() 였는지,, 이제는 꼭 기억하도록 하자.
ㅎㅎ.. 실수가 좀 많았지만 이번 문제 또한, 온전히 나의 힘으로 풀어내어서 뿌듯하다. 마지막으로 반복문 설계시,
for(char i = '0'; i < '10'; i++)
이렇게 char 형으로 곧바로 순회하는 것도 가능할 것 같다는 생각이 들었다.