백준 - 차량 번호판1(16968)

marafo·2020년 12월 16일
0

Back Tracking

문제

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

번호판에 사용할 수 있는 숫자는 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로만 이루어져 있다.

출력

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


실패한 풀이

import sys

input = sys.stdin.readline
li = list(sys.stdin.readline().strip())
dic = {'d': 10, 'c': 26}
case = 1

for i in range(len(li)):
    if li[i] == 'd':
        case *= 10
    elif li[i] == 'c':
        case *= 26
        
minus = dic[li[0]]
    
for i in range(1, len(li)):
    if li[i] != li[i - 1]:
        if li[i] == 'd':
            minus *= 10
        elif li[i] == 'c':
            minus *= 26
    elif li[i] == li[i - 1]:
        minus *= 1
        
print(case - minus)

연속된 문자열이 들어오면 배열로 바꿀 필요 없이 바로 인덱스를 활용한다.
굳이 전체의 경우에서 연속중복된 케이스를 빼지 않고 직접 구한다.
연속된 문자가 있다면 뒷문자는 앞문자를 쓰지 않아야 해서 본래 d, c의 값보다 하나 줄어든다.

nums = {'c': 26, 'd': 10}
li = input()
n = len(li)
res = nums[li[0]]

for i in range(1, n):
    mul = nums[li[i]]
    if li[i] == li[i - 1]:
        mul -= 1
    res *= mul
    
print(res)
profile
프론트 개발자 준비

0개의 댓글