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문이 끝났을 때 마지막 숫자만 나머지로 남아있게 된다. 이것까지 저장해주면 한 자리씩 배열에 들어갈 것이다.123456789101112int 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까지 들어있는 배열, 세트의 수를 나타낼 카운트 변수를 만들자.12int 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 감소시켜주면 된다.1234567for (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 감소시켜주자.
12345678if (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 감소시켜주자.12345678else {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
반응형
'Algorithm > 백준(BOJ)' 카테고리의 다른 글
[백준 1475] 방 번호 - java로 풀기 (0) | 2018.04.21 |
---|---|
[백준 1463] 1로 만들기 (0) | 2018.04.12 |
[백준 11441] 합 구하기 (0) | 2018.04.05 |
[백준 2292] 벌집 (0) | 2018.04.02 |
[백준 2438] 별찍기 - 1 (0) | 2018.03.31 |