practivceAlgorithm/백준

[백준][Python] 1342 행운의 문자열

findTheValue 2021. 7. 20. 23:11

항상 문자열에서 검사하고 중복 갯수세고 하는거 나오면

set()으로 목록 만들고

ord써서 반복문 돌릴수 있게 설계한다거나

char_count 배열에 갯수 저장해 넣고 뺄때 쓸 수 있게 설계.

string ='' 두고 더하고 빼고 슬라이싱 인덱싱 하는 스킬 더 기를 것.

문자열로 DFS돌리는 문제 은근 나옴.

슬라이싱으로 두문자씩, 두숫자씩 묶거나 숫자문자면 중간중간 int써서 수식계산 및 비교 까지 가능.

진법변환까지는 아직 문제못봄.

from sys import stdin
input = stdin.readline

def dfs(depth, string):
    global N, cnt

    if depth == N:
        # print(string)
        cnt += 1
        return
    # 종류별로 알파뱃 검사(깊이마다)
    for char in charSet:
        idx = ord(char) - 97
        # 알파뱃 다썼으면 돌아감.
        if charCnt[idx] == 0:
            continue
        # string 이 있고 전에 넣은게 지금꺼랑 같으면 돌아감.
        if string and string[-1] == char:
            continue
        # 전꺼랑 안같고 갯수남았으면 넣어봄. string누적, depth한칸, 알파뱃 개수 -1
        charCnt[idx] -= 1
        dfs(depth + 1, string + char)
        charCnt[idx] += 1


String = input().strip()
# 알파뱃 개수 누적. idx = ord('a')기준 0 -97해주면됨.
charCnt = [0] * 26
N = len(String)
cnt = 0
charSet = set()

# ord('a') = 97
# 숫자 세주고 charSet에 넣어 종류 파악.
for char in String:
    idx = ord(char) - 97
    charCnt[idx] = charCnt[idx] + 1
    charSet.add(char)
# print(charSet, charCnt, cntSum)

dfs(0, '')
print(cnt)