[백준] 3687:성냥개비

JIN·2021년 9월 30일
0

알고리즘

목록 보기
1/1

그리디

문제 풀이 방식:

  • 가장 작은 수
    맨 앞자리가 작을수록, 자리수가 작을수록 작은 수가 됨
  1. 처음에 자리수를 결정해준다. (0때문에 )
  2. 첫번째 자리 값을 결정한다.(문자열 형식)
  3. 남은 자리수로 만들수 있는 조합중 가장 작은 값을 구한다.(문자열 형식)
  4. 2번과 3번을 더한 후 숫자형식으로 바꾼다.
  • 가장 큰 수
    자리수가 가장 클 때 가장 큰 수가 됨
  1. 성냥개비 2개가 가장 작기 때문에 가장 많이 나오게 하고 남은 수로 배열을 만든다.
  2. 2개로 만들 수 있는 수는 1 남은 수를 가장 앞자리에 오게 한다.
  3. 숫자로 변환
from itertools import combinations_with_replacement
#맨 앞자리수 결정 (0제외)
compare = [1, 2, 3, 4, 5, 6, 7, 8, 9]
comAnswer = {1: 2, 2: 5, 3: 5, 4: 4, 5: 5, 0: 6, 6: 6, 9: 6, 7: 3, 8: 7}
# 성냥개비로 만들 수 있는 수
answer = {2: 1, 5: 2, 4: 4, 6: 0, 3: 7, 7: 8}
# 조합 할 수 있는 수
combination = [2, 3, 4, 5, 6, 7]
# 입력
tmps = []
# 입력
n = int(input())
for i in range(n):
	tmps.append(int(input()))

for tmp in tmps:
	#Min
	maxTmp = tmp
	# 7보다 작을 때
	if tmp <= 7:
		if tmp == 6:
			Min = 6
		else:
			Min = answer[tmp]
	# 자리 수 결정
	else:
		state = 0
		if tmp % 7 == 0:
			state = tmp // 7 - 1
		else:
			state = tmp // 7
		ret = -1
		# 맨 앞자리 결정
		for i, v in enumerate(compare):
			if ret == -2:
				break
			last = []
			first = []
			first.append(str(v))
			# 조합 리스트 만듦
			for j in combinations_with_replacement(combination, state):
				if (tmp - comAnswer[v]) == sum(j):
					last.append(list(j))
					ret = -2
				else:
					continue
		# 문자 -> 숫자로 변환
		last = [[answer[k] for j, k in enumerate(v)] for i, v in enumerate(last)]
		last = [[str(k) for j, k in enumerate(v)] for i, v in enumerate(last)]
		last = [''.join(v) for i, v in enumerate(last)]
		MinList = []
		Min = ''
		# 맨 앞자리 + 나머지
		first = len(last) * first
		for i in range(len(first)):
			Min = first[i] + last[i]
			MinList.append(Min)
		last = list(map(int, MinList))
		last = min(last)

	#Max
	maxList = []
	if maxTmp % 2 == 0:
		maxList = [2 for i in range(maxTmp //2)]
	else:
		if (maxTmp - 3) % 2 == 0:
			maxList = [2 for i in range((maxTmp - 3) // 2)]
			maxList.append(3)
	maxList = sorted(maxList, reverse=True)
	maxList = [answer[v] for i, v in enumerate(maxList)]
	maxList = [str(v) for i, v in enumerate(maxList)]
	Max = (''.join(maxList))
	Max = int(Max)
	print(Min, Max)

profile
배우고 적용하고 개선하기

0개의 댓글