문제
N보다 작거나 같은 자연수 중에서, 집합 K의 원소로만 구성된 가장 큰 수를 출력하는 프로그램을 작성하시오. K의 모든 원소는 1부터 9까지의 자연수로만 구성된다.
예를 들어 N=657이고, K={1, 5, 7}일 때 답은 577이다.
입력
첫째 줄에 N, K의 원소의 개수가 공백을 기준으로 구분되어 자연수로 주어진다. (10 ≤ N ≤ 100,000,000, 1 ≤ K의 원소의 개수 ≤ 3) 둘째 줄에 K의 원소들이 공백을 기준으로 구분되어 주어진다. 각 원소는 1부터 9까지의 자연수다.
단, 항상 K의 원소로만 구성된 N보다 작거나 같은 자연수를 만들 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 N보다 작거나 같은 자연수 중에서, K의 원소로만 구성된 가장 큰 수를 출력한다.
풀이
- 메모리 초과난다 ㅠㅠ 조금 더 줄여야할거같다
import sys
#sys.stdin = open("input.txt", "r")
def DFS(L, sum) :
global max_num
if L == k :
s = ''
for i in range(k) :
s += str(result[i])
if n >= int(s) and max_num <= int(s):
max_num = int(s)
else :
for i in range(k) :
result[L] = arr[i]
DFS(L+1, result)
n, k = map(int, input().split())
arr = list(map(int, input().split()))
check = [0] * n
result = [0] * k
max_num = 0
DFS(0, 0)
print(max_num)
풀이 2
- max값을 찾았을때 max_num 반환하고 중지(더이상 찾지 않는다.)
- max값을 찾지 못한 경우 None 반환
- 풀이1의 코드 같은 경우 1, 5, 7의 수중 n이 1655이면 1577을 반환해야 하는데 777을 출력하여 사이즈 수정
import sys
sys.stdin = open("input.txt", "r")
def DFS(L, result) :
m = len(result)
if L == m :
s = ''
for i in range(m) :
s += str(result[i])
if n >= int(s) : #n보다 작고, max_num보다 큰 값
return int(s)
else :
for i in range(k) :
result[L] = arr[i] #result[i]에 값 넣기
max_num = DFS(L+1, result) #다음 가지로 뻗기
if max_num is not None: #max값일때 max_num 반환
return max_num
return None #max값이 아닌 경우 None 값 반환
n, k = map(int, input().split())
num_size = len(str(n))
arr = list(map(int, input().split()))
arr.sort(reverse=True) #큰 숫자부터 찾기
data = DFS(0, [0] * num_size)
if(data is None): #1000이면 3자리 숫자 나와야하므로 None이면 3자리수 계산
data = DFS(0, [0] * (num_size-1))
print(data)
'코테풀이 > 백트랙킹' 카테고리의 다른 글
[프로그래머스 | 2단계] 소수찾기(백트랙킹) (0) | 2021.12.28 |
---|---|
[프로그래머스 | 2단계] 타겟 넘버(백트랙킹, 전역변수) (0) | 2021.12.22 |
[프로그래머스 | 1단계] 폰켓몬(set, 백트랙킹) (0) | 2021.12.18 |
[백준 | 실버2] 6603번:로또(백트랙킹) (0) | 2021.12.13 |
[백준 | 실버5] 5568번: 카드 놓기(백트랙킹) (0) | 2021.12.11 |
[백준 | 실버5] 18511번:큰 수 구성하기(백트랙킹)