본문 바로가기
Coding Test/Problems

[BOJ | Python] 5568번: 카드 놓기

by haerr 2025. 9. 21.

https://www.acmicpc.net/problem/5568

 

문제

상근이는 카드 n(4 ≤ n ≤ 10)장을 바닥에 나란히 놓고 놀고있다. 각 카드에는 1이상 99이하의 정수가 적혀져 있다. 상근이는 이 카드 중에서 k(2 ≤ k ≤ 4)장을 선택하고, 가로로 나란히 정수를 만들기로 했다. 상근이가 만들 수 있는 정수는 모두 몇 가지일까?

예를 들어, 카드가 5장 있고, 카드에 쓰여 있는 수가 1, 2, 3, 13, 21라고 하자. 여기서 3장을 선택해서 정수를 만들려고 한다. 2, 1, 13을 순서대로 나열하면 정수 2113을 만들 수 있다. 또, 21, 1, 3을 순서대로 나열하면 2113을 만들 수 있다. 이렇게 한 정수를 만드는 조합이 여러 가지 일 수 있다.

n장의 카드에 적힌 숫자가 주어졌을 때, 그 중에서 k개를 선택해서 만들 수 있는 정수의 개수를 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 n이, 둘째 줄에 k가 주어진다. 셋째 줄부터 n개 줄에는 카드에 적혀있는 수가 주어진다.

 

 

출력

첫째 줄에 상근이가 만들 수 있는 정수의 개수를 출력한다.

 

 

풀이

from itertools import permutations as pm

n = int(input())
k = int(input())
cards = [input() for _ in range(n)]
ans = set()

for i in pm(cards, k):
    temp = ''
    for j in i:
        temp += j # 위에서 뽑힌 각 카드를 하나의 수로 만드는 과정
    ans.add(int(temp))

print(len(ans))

 

파이썬의 기본 내장 함수인 permutation과 set을 사용하여 풀었다.

먼저 k개의 카드를 뽑아서 만든 수를 저장할 ans 배열을 set으로 설정했다.

이후 permutations 함수를 사용해 만든 수인 temp를 ans에 추가했고, 마지막으로 ans 집합의 길이를 출력하여 답을 구하였다.