2018년 8월 2일 목요일

백준 2577: 숫자의 개수 풀이

문제 링크
https://www.acmicpc.net/problem/2577

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <stdio.h>  // for sprintf
#include <string.h> // for strlen
using namespace std;
 
/*
    100 <= input < 1000 인 3개 값을 입력받아서 각각의 값을 곱한 수를 구한다.
    그리고 그 수에서 0 - 9까지의 숫자가 각각 몇 번 나왔는지를 확인하면 된다.
    
    최대값인 999 가 세 번 나와서 곱하는 경우에도 값은 997,002,999 이므로
    4 byte int의 값의 범위인 -2,147,483,648 ~ 2,147,483,647 (21억) 범위를 넘어서지 않는다.
    그러니까 그냥 int 사용.
    
    각 자리수가 0 - 9 중 어느 숫자인지를 확인해야되는데,
    생각한 방법은 곱한수를 문자열로 바꿔서 확인하거나
    아니면 나머지 연산 방식으로 각각의 자리수를 구하는 방식이었다.
*/
 
int main() 
{    
    // 입력 받을 변수
    int input[3= {0, };
    
    cin >> input[0];
    cin >> input[1];
    cin >> input[2];
    
    int multi = 1;
    for(size_t loopCount = 0; loopCount < sizeof(input)/sizeof(int); loopCount++)
    {
        multi *= input[loopCount];
    }
    
    // 곱한 값을 문자열로 저장한다. 문자열로 변환하는 것은 곱한 결과값이 몇 자리수인지를 확인하기 위함.
    char buffer[10= {0, };
    sprintf(buffer, "%d", multi);
    
    // 각 숫자가 몇 번 나왔는지 저장할 변수. 최대 자리수는 9자리이므로 하나의 숫자가 많이 나와도 최대 9다.
    // 그러니까 char로 메모리 사용량을 줄여본다.
    // ex) [0] = 0이 몇 번 나왔는지를 기록한다.
    int output[10= {0, };
    
    for(size_t loopCount = 0; loopCount < strlen(buffer); loopCount++)
    {
        output[multi%10+= 1;
        multi /= 10;
    }
    
    // print
    for(size_t loopCount = 0; loopCount < sizeof(output)/sizeof(int); loopCount++)
    {
        cout << output[loopCount] << endl;
    }
    
    return 0;
}
cs

댓글 없음:

댓글 쓰기

A*, JPS 길찾기 알고리즘 시뮬레이션 사이트

https://qiao.github.io/PathFinding.js/visual/ 길 찾기 알고리즘 시행 과정을 보여주는 사이트다. 링크 메모..