Odds and Ends
백준 : 16922번 로마 숫자 만들기[파이썬, 백트래킹, 실버4] 본문
문제
로마 숫자에서는 수를 나타내기 위해서 I, V, X, L을 사용한다. 각 문자는 1, 5, 10, 50을 의미하고, 이 문제에서 다른 문자는 사용하지 않는다.
하나 또는 그 이상의 문자를 이용해서 수를 나타낼 수 있다. 문자열이 나타내는 값은, 각 문자가 의미하는 수를 모두 합한 값이다. 예를 들어, XXXV는 35, IXI는 12를 의미한다.
실제 로마 숫자에서는 문자의 순서가 중요하지만, 이 문제에서는 순서는 신경쓰지 않는다. 예를 들어, 실제 로마 숫자에서 IX는 9를 의미하지만, 이 문제에서는 11을 의미한다.
로마 숫자를 N개 사용해서 만들 수 있는 서로 다른 수의 개수를 구해보자.
입력
첫째 줄에 사용할 수 있는 문자의 개수 N (1 ≤ N ≤ 20)이 주어진다.
출력
첫째 줄에 로마 숫자 N개를 사용해서 만들 수 있는 서로 다른 수의 개수를 출력한다.
예제 입력
1
예제 출력
4
I, V, X, L을 만들 수 있다.
예제 입력
2
예제 출력
10
2, 6, 10, 11, 15, 20, 51, 55, 60, 100을 만들 수 있다.
[문제 해석]
: 설명이 어렵지 않은 문제이다.
사용 가능한 문자의 개수가 주어지고, 그 개수만을 가지고 만들 수 있는 서로 다른 수의 개수를 출력하면 되는 문제이다.
모든 경우의 수를 구하는 것이 관건이다.
순서를 고려하지 않는 중복조합을 이용한다.
뽑은 조합이 달라도 나오는 수(=합)이 같은 경우가 존재하기 때문에 중복을 없애줘야한다.
중복조합 리스트는 파이썬 기본 라이브러리인
itertools 에 combinations_with_replacement([반복가능한 개체],길이) 을 통해 리스트를 얻을 수 있다.
[코드 풀이]
from itertools import combinations_with_replacement
k= int(input())
dataset = [1, 5, 10,50]
temp = list(combinations_with_replacement(dataset, k)) # dataset에서 k개만 꺼내 이루어진 무작위 조합
result = []
for i in temp:
result.append(sum(i))
print(len(set(result))) # set으로 중복 제거
'코딩 테스트' 카테고리의 다른 글
백준 : 2044번 촌수계산 [파이썬, 실버2, BFS/DFS] (0) | 2022.07.23 |
---|---|
백준 : 2606번 바이러스 [파이썬, 실버3, DFS/BFS] (0) | 2022.07.23 |
백준 : 20950 미술가 미미 [실버2, 파이썬, 백트래킹] (0) | 2022.07.22 |
백준 : 1427 소트인사이드 [문자열, 파이썬] (0) | 2022.07.20 |
백준 : 5635번 생일 [문자열, 파이썬] (0) | 2022.07.20 |