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

 


 

1초 / 512MB

 

문제

상도시의 차량 번호판 형식이 주어졌을 때, 가능한 차량 번호판의 개수를 구해보자.

  • 번호판에 사용할 수 있는 숫자는 0, 1, 2, ..., 8, 9이다.
  • 사용할 수 있는 문자는 a, b, c, d, ..., y, z이다.
  • 차량 번호판의 형식은 최대 4글자이고, c와 d로 이루어진 문자열로 나타낼 수 있다.
  • c는 문자가 위치하는 자리, d는 숫자가 위치하는 자리이다.
  • 같은 문자 또는 숫자가 연속해서 2번 나타나면 안 된다.

예를 들어, 형식이 "cd"이면, a1, d4, h5, k4 등이 가능하다. 형식이 "dd"인 경우에 01, 10, 34, 69는 가능하지만, 00, 11, 55, 66은 같은 숫자가 2번 연속해서 불가능하다.

입력

첫째 줄에 차량 번호판의 형식이 주어진다. 형식은 길이가 4보다 작거나 같으며, c와 d로만 이루어져 있다.

출력

첫째 줄에 가능한 차량 번호판의 개수를 출력한다.


  • 0, 1, 2, ..., 8, 9
  • a, b, c, d, ..., y, z
  • 최대 4글자
  • c는 문자가 위치하는 자리, d는 숫자가 위치하는 자리
  • 같은 문자 또는 숫자가 연속해서 2번 나타나면 안 된다
  • 가능한 차량 번호판의 개수

 

 

채점 결과

 

풀이 (C++)

 

  • iostream
  • string
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
#include <iostream>
#include <string>
 
using namespace std;
 
int main() {
    string in;
    cin >> in;
    int num = 10;
    int c = 26;
    int ans = 1;
    for (char x : in) {
        if (x == 'd') {
            ans *= num;
            num = 9;
            c = 26;
        }
        else {
            ans *= c;
            num = 10;
            c = 25;
        }
    }
    cout << ans;
}
cs

 

풀이 과정

연속으로만 나오면 안 된다 그리고 경우의 수만 구하면 된다

처음 가능한 '숫자'의 경우의 수는 10, 이후 반복 출현할 경우 9 // ex) dddd => 10*9*9*9

처음 가능한 '글자'의 경우의 수는 26, 이후 반복 출현할 경우 25 // ex) cccc => 26*25*25*25

따라서 '숫자'일 경우에는 '글자'의 경우의 수를 26으로 복구해줘야하고

'글자'의 경우에는 '숫자'의 경우의 수를 10으로 복구해줘야 한다

( 같은 종류가 연속되는 경우가 아니므로 )

ex) cdcd => 26*10*26*10

 

 


  1. 8번 줄 // 입력 받음
  2. 11번 줄 // 정답은 1로 준비 ( 최대 경우의 수 26*25*25*25가 int 범위 내이므로 int로도 가능 )
  3. 13~22번 줄 // 한 글자씩 확인한다
    1. 13~17번 줄 // 만약 d일 경우
    2. 정답에 가능한 숫자 경우의 수 곱함
    3. c는 26으로 초기화
    4. 수가 연속될 것에 대비해 num는 9로
    1. 18~22번 줄 // 만약 d일 경우
    2. 정답에 가능한 숫자 경우의 수 곱함
    3. 수가 연속될 것에 대비해 num는 25로
    4. num는 10으로 초기화
  4. 24번 줄 // 정답 출력

 

주의사항

  1. 처음 ans를 0이 아닌 1로 둬서 경우의 수를 계속 곱해준다