관리 메뉴

cococo-coding

[C++ 풀이] 2774번. 아름다운 수 본문

[BOJ] 코드 모음/C++_learning 문제집

[C++ 풀이] 2774번. 아름다운 수

_dani 2024. 1. 16. 18:41

문제

풀이

아스키코드를 활용해야 하는 문제이다.

 

테스트케이스 개수t를 입력받고 while문으로 돌린다.

입력받을 수x를 string으로 선언하고, 각 수가 나온 횟수를 셀 카운팅 배열 arr[10]을 선언하고 0으로 초기화해준다.

for문을 이용해 입력받은 수는 string이므로 문자형태이다. 즉, 아스키코드로 인식이 되는 상황이기 때문에 문자0('0')을 빼주어야 한다. (문자 0은 아스키코드로 48이다)

s[i]-48을 arr의 인덱스인수로 넣어주고, 증가시켜준다. 

 

그리고 arr배열을 for문으로 돌리면서 0이 아닌 수를 만나면 cnt를 증가시켜주고

최종적으로 cnt를 출력해준다. 

 

포인트

문자0 은 아스키코드로 48이므로, 숫자로 쓰려면 48을 빼주어야 한다.

만약 위의 방법처럼 하지 않고, 바로 출력하게 되면 아래 그림처럼 7을 입력하면(문자7) -> 55가 출력되는 상황이 나온다. 

아스키코드를 고려하지 않은 예시

 

코드

#include <iostream>
#include <vector>
using namespace std;

/*
    1. 테스트케이스의 개수 t를 입력받는다.
    2. 수x를 입력받는다.
    3. 각 수의 아름다운 정도를 찾는다.
    4. 아름다운 정도를 출력한다.

*/

int main() {
    //1
    int t;
    cin >> t;

    //2
    while (t--) {
     int arr[10] = { 0, }; //카운팅 배열
     int cnt = 0;

     string s;
     cin >> s;

     //지금 string으로 입력받은 숫자는 '문자'임
     //아스키코드라는 뜻
     //1=(int)49, 2=(int)50 ... 그러니 동일하게 해주려면 48을 빼줘야함
     for (int i = 0; i < s.size(); i++) {       
         arr[s[i] - 48]++;
     }

     //4
     for (int i = 0; i < 10; i++) {
            if (arr[i] != 0) cnt++; //한번은 나온 수들 카운팅
     }
        cout << cnt << endl;
    }
    return 0; 
}