문제
https://school.programmers.co.kr/learn/courses/30/lessons/42895
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해석
정말 생각하기 어렵다..
메인이 되는 아이디어 2가지가 있는데
첫번째는 아래와 같다.
예를 들어
5를 3번 사용해서 가능한 가짓수는
5를 "0번 사용 + 3번 사용"
5를 "1번 사용 + 2번 사용"
이라는 것이다
이 경우의 수를 일반화해보면
N이라는 수를 i 번 사용해서 나타낼 수 있는 경우의 수는
0 + (i)
1 + (i-1)
2 + (i-2)
...
이 될 것이다.
두번째 아이디어는 N을 5라고 가정했을 경우 '5, 55, 555 ...' 와 같은 수들도 가능하기 때문에
미리 해당 수를 준비해두고, 이후의 계산과정에서는 이를 이용하기만 하면 되는 것이다.
정답
def solution(N, number):
answer = -1
if N == number:
return 1
answerSet = [set() for _ in range(8)]
for i in range(8):
answerSet[i].add(int((i+1)*str(N)))
# N개로 만드는 것은 결국 : (i+j)= N 개가 되는 답으로 귀결된다
# 1개로 만들 수 있는 값 : 1
# 2개로 만들 수 있는 값 : 0 + 2 or 1 + 1
# 3개로 만들 수 있는 값 : 0 + 3 or 1 + 2
# 4개로 만들 수 있는 값 : 0 + 4 or 1 + 3 or 2 + 2
# i: 0, j: X
# i: 1, j: 0, i-j-1: 0
# i: 2, j: 0, 1 i-j-1: 1, 0
# i: 3, j: 0, 1, 2 i-j-1: 2, 1, 0
# i: 4, j: 0, 1, 2, 3 i-j-1: 3, 2, 1, 0
for i in range(8):
for j in range(i):
for op1 in answerSet[j]:
for op2 in answerSet[i-j-1]:
answerSet[i].add(op1 + op2)
answerSet[i].add(op1 - op2)
answerSet[i].add(op1 * op2)
if op2 != 0:
answerSet[i].add(op1 // op2)
if number in answerSet[i]:
return i+1
return answer
(i, i-j-1)에서 (0, 2) 가 실행되었는데 (2, 0) 이 계산되는 것은 중복이 아니냐구?
아니다. op1 // op2 의 순서를 지켰기 때문에, op2 // op1 과 같은 연산도 해줘야 하기 때문이다.
두 값의 결과가 다르게 나옴!
이거.. 너무 어렵다..
컴퓨터적 사고..
끗
'알고리즘 공부 > ps' 카테고리의 다른 글
[LeetCode] Find All Duplicates in an Array (0) | 2024.03.25 |
---|---|
[LeetCode] Two Sum (0) | 2024.03.24 |
[프로그래머스] 21년 카카오 공채 - 메뉴 리뉴얼 (0) | 2024.02.19 |
[백준] 문자열 폭발 - 9935번 (1) | 2024.01.24 |
[프로그래머스] 불량 사용자 - 카카오 19년 동계 인턴 (0) | 2024.01.22 |