Algorithm/백준(BOJ)

[백준 1475] 방 번호

Gyoogle 2018. 4. 10. 13:30
728x90
반응형

[백준 1475] 방 번호


문제 출처 : https://www.acmicpc.net/problem/1475




문제


다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.


다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최소값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)




입력


첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.




출력


첫째 줄에 필요한 세트의 개수를 출력한다.






예제 입력


1
9999
cs


예제 출력

1
2
cs




  • 문제 이해하기

    자기 집의 방 번호를 플라스틱 숫자로 문에 붙이려고 하고 있다. 플라스틱 숫자 세트(0~9)를 이용해서 방 번호를 붙일 때, 세트가 몇 개 필요한지 출력해주어야 하는 문제다. 세트에는 0부터 9까지 1개씩만 들어있기 때문에, 만약 방 번호에 1이 두 번 들어가면 나머지 숫자에 상관없이 2세트가 필요하다는 것을 알 수 있다. 하지만 문제의 전제 조건으로, 6은 뒤집어서 9로도 사용할 수 있기 때문에 방 번호에 9는 없고 6만 2개 있으면 1세트로도 가능하다는 조건이 존재한다는 것을 기억하자.

    따라서 예제처럼 방 번호가 9999이면, 세트 당 들어있는 6,9를 이용해서 2세트면 만들어 낼 수 있다.

  • 계획 및 문제해결

    1) 입력한 방 번호를 하나씩 저장시키기

    우리가 입력한 숫자를 하나씩 이용해야 한다. 즉, 9999를 입력하면 '9','9','9','9'로 저장해야 세트가 몇 개 필요한 지 비교할 수 있을 것이다. 몫과 나눗셈을 통해서 해결이 가능했다.

    9999를 10으로 나눈 몫(9999/10) = 999 / 나머지(9999%10) = 9

    번호를 저장할 배열을 만들고 이렇게 10으로 나누면서 나머지를 저장시키면 처음에 입력한 번호를 한자리씩 저장이 가능하다.

    while문을 통해서 처음에 입력한 N을 10으로 나눈 몫이 0이 될 때까지 반복하면 된다. 이 과정을 거치면, while문이 끝났을 때 마지막 숫자만 나머지로 남아있게 된다. 이것까지 저장해주면 한 자리씩 배열에 들어갈 것이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int N; // 방번호 입력 값 선언
    int number[10= {}; // 방번호 입력값 하나씩 저장할 배열 선언
    int n = 0// 방번호 자릿수 파악할 카운트 선언
     
    cin >> N;
     
    while (N / 10 != 0) { // N의 몫이 0일때 까지
        number[n] = N % 10// 10으로 나눈 나머지 저장(1의 자리수)
        N /= 10// N을 몫 값으로 변경
        n++// 자릿수 파악할 n 1증가
    }
    number[n] = N % 10// N의 몫이 0일 때 마지막 수 저장
    cs

    이제 number[n] 배열에 N을 하나씩 쪼갠 수들을 넣는 것으로 첫 문제를 해결했다. 이 배열에 들어있는 값을 통해 세트가 몇 개 필요한 지 비교만 해주면 된다.


    2) 숫자를 통해 세트가 몇 개 필요한지 파악하기


    우선 0부터 9까지 들어있는 배열, 세트의 수를 나타낼 카운트 변수를 만들자.

    1
    2
    int arr[10= {0,}; // 0~9 플라스틱 숫자 세트를 나타내는 배열 (초기값 모두 0으로 저장)
    int cnt = 0// 세트 수를 출력할 cnt 선언
    cs

    우리는 세트로 이용할 arr배열 크기를 10으로 주었다. 이는 0부터 9까지 숫자가 몇 개씩 내게 있는 지 알려주는 배열로 활용할 것이다. 처음에는 아무것도 없기 때문에 {0,}을 통해 값을 0으로 초기화시켜주었다.

    방 번호가 입력된 이후에 한 자리씩 for문으로 들어오면, 이 arr배열 값을과 비교하는 것으로 접근하면 될 것이다.

    만약 방 번호의 배열의 값이 0일 때 그 번호가 필요하면, arr배열을 1씩 증가시키고 세트의 수에 해당하는 cnt(카운트)도 그때마다 1씩 증가시켜주면 된다.

    이는 for문을 통해서 방 번호가 하나씩 저장되어 있는 number[n]을 통해서 알 수 있는 'n'번을 반복하면 된다.

    for문의 큰 형태는 아래와 같이 해당 번호를 갖고 있지 않을 때와 갖고 있을 때로 나누어지고, 갖고 있을 때는 해당 배열의 값을 1 감소시켜주면 된다.

    1
    2
    3
    4
    5
    6
    7
    for (int i = 0; i <= n; i++) {
        if (arr[number[i]] == 0) { // 해당 번호를 갖고 있지 않을 때
     
     
        else { // 갖고 있을 때
            arr[number[i]] -= 1;
        }
    cs




    이때 for문 안에서 조건문을 통해 방 번호가 6일 때와 9일 때를 확인시켜야 한다. (방번호에 6이 2개면, 한 세트에서 6과 9를 이용할 수 있도록)

    만약 해당하는 조건문에 들어가면, continue를 이용해서 다음 for문으로 넘어가면 된다.


    만약 6이 필요한 데, 6은 없고 9는 있다면? arr[9]의 값을 1 감소시켜주자.


    만약 9가 필요한 데, 9는 없고 6이 있다면? arr[6]의 값을 1 감소시켜주자.

    1
    2
    3
    4
    5
    6
    7
    8
    if (number[i] == 6 && arr[9!= 0) { // 6이 없는데 9가 있을 때
        arr[9-= 1;
        continue;
    }
    else if (number[i] == 9 && arr[6!= 0) { // 9가 없는데 6이 있을 때
        arr[6-= 1;
        continue;
    }
    cs




    만약 둘다 없다면? 평소와 똑같이 세트를 늘리고 해당 번호를 1 감소시켜주자.

    1
    2
    3
    4
    5
    6
    7
    8
    else {
     
        for (int j = 0; j < 10; j++) {
            arr[j] += 1// set 증가
        }
        cnt++// set 카운트
        arr[number[i]] -= 1// 해당 값 개수 감소
    }
    cs


    마지막으로 cout을 통해 cnt를 출력해주면 원하는 세트의 수를 나타낼 수 있다.




  • 전체 소스코드


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
#include <iostream>
 
using namespace std;
 
int arr[10= {0,}; // 0~9 플라스틱 숫자 세트를 나타내는 배열 (초기값 모두 0으로 저장)
int cnt = 0// 세트 수를 출력할 cnt 선언
 
int main(void) {
 
    int N; // 방번호 입력 값 선언
    int number[10= {}; // 방번호 입력값 하나씩 저장할 배열 선언
    int n = 0// 방번호 자릿수 파악할 카운트 선언
 
    cin >> N;
 
    while (N / 10 != 0) { // N의 몫이 0일때 까지
        number[n] = N % 10// 10으로 나눈 나머지 저장(1의 자리수)
        N /= 10// N을 몫 값으로 변경
        n++// 자릿수 파악할 n 1증가
    }
    number[n] = N % 10// N의 몫이 0일 때 마지막 수 저장
 
 
    for (int i = 0; i <= n; i++) {
        if (arr[number[i]] == 0) { // 해당 번호를 갖고 있지 않을 때
 
            if (number[i] == 6 && arr[9!= 0) { // 6이 없는데 9가 있을 때
                arr[9-= 1;
                continue;
            }
            else if (number[i] == 9 && arr[6!= 0) { // 9가 없는데 6이 있을 때
                arr[6-= 1;
                continue;
            }
 
            else {
 
                for (int j = 0; j < 10; j++) {
                    arr[j] += 1// set 증가
                }
                cnt++// set 카운트
                arr[number[i]] -= 1// 해당 값 개수 감소
            }
        }
        else { // 갖고 있을 때
            arr[number[i]] -= 1;
        }
    }
 
    cout << cnt;
}
cs


728x90
반응형