728x90
시간 제한 2초, 메모리 제한 256MB
# 조건
- 민식이와 준영이는 자기 방에서 문자열을 공부하고 있다.
- 민식이가 말하길 인접해 있는 모든 문자가 같지 않은 문자열을 행운의 문자열이라고 한다고 한다.
- 준영이는 문자열 S를 분석하기 시작했다.
- 준영이는 문자열 S에 나오는 문자를 재배치하면 서로 다른 행운의 문자열이 몇 개 나오는지 궁금해졌다.
- 만약 원래 문자열 S도 행운의 문자열이라면 그것도 개수에 포함한다.
입력
- 첫째 줄에 문자열 S가 주어진다.
- S의 길이는 최대 10이고, 알파벳 소문자로만 이루어져 있다.
출력
- 첫째 줄에 위치를 재배치해서 얻은 서로 다른 행운의 문자열의 개수를 출력한다.
# 접근 방법
- itertools의 Counter함수와 백트래킹을 이용해서 풀어준다.
- 우선 입력받은 문자열을 Counter 함수로 통해 각 알파벳마다 몇 개씩 존재하는지 딕셔너리로 만들어준다.
- 이후 백트래킹 함수를 돌리면서 현재 탐색중인 단어가
- 직전에 배치한 단어가 아니고
- Counter가 0이 아니라면 재귀로 현재 단어와 선택한 단어의 수 + 1을 함수의 인자로 재귀를 돌려준다.
- 현재 단어의 선택이 끝난다면 개수를 다시 +1을 해주어야 한다는 점이 중요하다.
import sys
input = sys.stdin.readline
def dfs(pre_word, picked):
if picked == len(S):
return 1
answer = 0
for key in counter.keys():
if pre_word == key:
continue
if counter[key] == 0:
continue
counter[key] -= 1
answer += dfs(key, picked+1)
counter[key] += 1
return answer
S = list(input().strip())
counter = dict()
for s in S:
if s in counter:
counter[s] += 1
else:
counter[s] = 1
answer = dfs('', 0)
print(answer)
728x90
'ALGORITHM > 백트래킹' 카테고리의 다른 글
[백준 6987번] 파이썬 - 월드컵 (0) | 2023.09.12 |
---|---|
[백준 14889번] 파이썬 - 스타트와 링크 (0) | 2023.09.10 |
[백준 3980번] 파이썬 - 선발 명단 (0) | 2023.08.27 |
[백준 28447번] 파이썬 - 마라탕 재료 고르기 (0) | 2023.08.16 |
[백준 15664번] 파이썬 - N과 M(10) (0) | 2023.08.16 |