입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.
예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현할 수 있습니다.
접근법
위의 예제1의 값을 예로 들면, 5를 한번 사용해서 만들 수 있는 수는 5, 두번 사용해서 만들 수 있는 수는 55, 5+5(10), 5-5(0), 5x5(25), 5/5(1) 입니다. 이로 알 수 있는 점은 첫 번째 경우(숫자를 단순히 이어붙인 경우)를 제외하고는 모두 5를 이용한 사칙연산 결과들 입니다. 이제 코드에 적용시켜봅시다. 먼저 길이가 8인 리스트 S를 선언해줍니다. 리스트의 원소는 집합으로 정의해줍니다. 집합을 사용하여야 중복이 생기지 않습니다. 반복문을 사용하여 N을 i만큼 곱해주면, 숫자를 단순히 이어붙인 경우를 만들어줍니다. 저 반복문을 지나면 S = [{5},{55},{555},{5555},...,{55555555}]이 생성됩니다. 이제 이를 반복문을 통해 사칙연산을 계산해 줍니다. S의 첫 번째 원소는 N을 1개 사용해서 만들 수 있는 수들의 집합, 두 번째 원소는 N을 2개 사용해서 만들 수 있는 집합, 세 번째 원소는 N을 3개 사용해서 만들 수 있는 집합, .. 이렇게 여덟번째 원소까지 모두 계산을 해줍니다. 만약 계산된 수 중에서 number가 있다면, 그 수의 인덱스에 1을 더한 값을 반환해주고(실제로는 1부터 세기 때문에, 인덱스는 0부터 입니다) 8까지 모두 돌았지만, 없는 경우에는 -1을 리턴해 줍니다. (초기값을 -1으로 설정했기 때문에 반복문을 빠져나오면 그대로 -1을 반환합니다.)
나의 코드
def solution(N, number):
answer = -1
S = [set() for x in range(8)]
for i,x in enumerate(S, start=1):
x.add(int(str(N)*i))
for i in range(1, len(S)):
for j in range(i):
for op1 in S[j]:
for op2 in S[i-j-1]:
S[i].add(op1 + op2)
S[i].add(op1 - op2)
S[i].add(op1 * op2)
if op2 != 0:
S[i].add(op1 // op2)
if number in S[i]:
answer = i + 1
break
return answer