읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
DP는 연산자건 페어를 맞추는 문제가 많이 나오는데 피보나치 수열마냥 이전 몇개의 항만 고려했다가 낭패를 보기 쉽다. 이 문제도 그러하다. 숫자 N을 써서 적당히 사칙연산을 집어넣어 나온 값을 비교하는 문제로 예를 들어 4개를 사용할 경우 하위 문제는 N을 1번 사용 + N을 3번 사용
, N을 2번 사용 + N을 2번 사용
, N을 3번 사용 + N을 1번 사용
으로 분리할 수 있다. 분할된 값은 괄호가 씌워진 상태라봐도 무방하며 추가로 연산없이 N을 i번 사용한 NNNN형태도 고려해야 한다.
- N과 number 비교 후 같으면 1 return
- 1번 사용은 N밖에 없으므로 초기항으로 설정
- 2부터 8까지 진행하며 이 과정 동안 일치하는 값이 없다면 마지막으로 -1을 리턴한다.
- 2-8까지의 i항에 대해 우선 N*i 꼴의 숫자를 비교, 일치하면 i리턴, 그렇지 않으면 set에 삽입(중복된 값이 나올 수 밖에 없으므로 set 자료형을 활용한다.)
- 1부터 i-1까지 i-1부터 1과 배칭하여 서로 +, - *, // 연산을 수행하여 값 비교 후 일치하면 i리턴, 그렇지 않으면 set에 삽입한다. 나눗셈 연산 시 몫이 0이 되는 경우를 체크해야 한다.
- 하위 셋에 대해 연산이 끝나면 배열에 넣어 이후 연산에 활용한다.
python 코드
def solution(N, number): if number == N: return 1 buf = [None] b = set() b.add(N) buf.append(b) for i in range(2, 9): b = set() s = int(str(N) * i) if s == number: return i b.add(s) for j in range(1, i): for x in buf[j]: for y in buf[i - j]: s = x + y if s == number: return i b.add(s) s = x - y if s == number: return i b.add(s) s = x * y if s == number: return i if y != 0: s = x // y if s == number: return i b.add(s) buf.append(b) return -1
'Algorithms > Programmers' 카테고리의 다른 글
Programmers. 단어 퍼즐 (0) | 2021.09.04 |
---|---|
Programmers. 징검다리 (0) | 2021.08.14 |
Programmers. 다리를 지나는 트럭 (0) | 2021.08.10 |
Programmers. 도둑질 (0) | 2021.08.10 |
Programmers. 등굣길 (0) | 2021.08.10 |