Algorithm Problems

[백준] [Python] 1759번 암호 만들기 - 백트래킹

WakaraNai 2021. 5. 12. 00:53
728x90
반응형

www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

 

 

 

Python

 

1. abcd bacd 처럼 visit 리스트는 일치하지만 정렬되지 않은 문자 거르기

단어 전체 길이을 추적하기 위한 k 변수 외에

처음 받은 배열에서 현재 사용한 문자의 위치를 저장해주는 next를 생성

for문은 k부터 시작하는 것이 아니라 next부터 시작하여 정렬 및 중복 예방

import sys
l, c = map(int, sys.stdin.readline().split())
arr = sys.stdin.readline().split()
arr.sort()
visit = [0]*c
word = []

# v == vowel

# next를 두어 순서가 뒤집히지 않도록 함
def back(k, next, v, ccnt):
    if k == l:
        if v and ccnt > 1:
            print(''.join(word))
        return

    for i in range(next, c):
        if visit[i] == 0:
            visit[i] = 1
            word.append(arr[i])

            # ccnt와 v를 바꾸면 이후에 되돌려줘야 하기 때문에
            # 함수 실행 시에 덧셈을 해주어 원래 값 유지
            if not v or ccnt < 2:
                if arr[i] in 'aeiou':
                    back(k+1, i+1, 1, ccnt)
                else:
                    back(k+1, i+1, v, ccnt+1)
            else:
                back(k+1, i+1, v, ccnt)
            visit[i] = 0
            word.pop()


back(0, 0, 0, 0)

 

 

2. 자음 개수 = 전체 - 모음

그러므로 자음 개수만 추적하면 된다

import sys
l, c = map(int, sys.stdin.readline().split())
arr = sys.stdin.readline().split()
arr.sort()
visit = [0]*c
word = []


def back(k, next, v):
    if k == l:
        if v and len(word)-v > 1:
            print(''.join(word))
        return

    for i in range(next, c):
        if visit[i] == 0:
            visit[i] = 1
            word.append(arr[i])

            # 자음 = 전체 - 모음
            if arr[i] in 'aeiou':
                back(k+1, i+1, v+1)
            else:
                back(k+1, i+1, v)
                
            visit[i] = 0
            word.pop()


back(0, 0, 0)
728x90
반응형