본문 바로가기
알고리즘/완전탐색

[백준][Python] 5568번 카드 놓기

by 임짠짠 2022. 7. 8.
반응형
 

5568번: 카드 놓기

예제 1의 경우 상근이는 11, 12, 21, 112, 121, 122, 212를 만들 수 있다.

www.acmicpc.net

 

코드 1

from itertools import permutations

n = int(input())
k = int(input())
n_list = []
dic = {}
cnt = 0
for _ in range(n):
	n_list.append(int(input()))
m_list = list(permutations(n_list,k))
for a in m_list:
	b = ''
	for i in a:
		b += str(i)
	if b not in dic:
		dic[b] = 1
		cnt+=1
	
print(cnt)

permutations 함수를 이용해서 만들 수 있는 모든 조합을 구해서 m_list에 저장했다. 

구해진 조합의 숫자들을 어떻게 하나의 숫자로 합칠까 고민을 하다가 각각의 숫자들을 string 형으로 바꿔서 다 더해주었다. join을 쓰고 싶었는데 잘 안 됐다.. 중복체크도 딕셔너리를 이용해서 해주었는데 다른 풀이를 보니 set 함수를 다들 많이 사용했다. 

 

코드 2

from itertools import permutations

n = int(input())
k = int(input())
n_list = []

for _ in range(n):
	n_list.append(int(input()))
m_list = list(permutations(n_list,k))

ans = set()
for a in m_list:
	b =''.join((map(str,a)))
	ans.add(b)
print(len(ans))

map(str,a)를 이용해서 a의 모든 요소를 string 형으로 바꿔준 후 join을 했다. 위에서는 string 형으로 바꿔주지 않아서 오류가 났었던 것 같다. 이번에는 딕셔너리를 사용하지 않고 set 함수를 사용했다. set은 값을 넣어줄 때 append가 아닌 add를 사용한다. 중복되는 값이 들어오면 그 값은 추가되지 않는다.

반응형

댓글