문제
https://school.programmers.co.kr/learn/courses/30/lessons/42895?language=python3#
사용 언어
Python3
풀이 과정
DP문제... 점화식 너무 어려워...흐아앙
처음에 생각한 방식은 그냥 엉망진창이었고 질문하기에서 이 글의 도움을 받아 힌트를 얻었다...
그러고도 한참을 생각하다가 겨우 간신히 풀었는데 2개가 실패!
이게 틀린 코드인데 다시 보니 return이 N이 3일 때부터 가능해서 1부터 가능하도록 range 범위를 바꿔줬다. 1, 2일 땐 직접 선언해준게 괜히...문제가 됐네. 지금 보니 2는 왜 그렇게 했는지 의문이고 1은 N 자체 하나만 가능해서 사칙연산에 포함시키지 않으려고 했는데 어차피 j의 범위가 1 ~ 0이 돼서 for문을 돌지 않는다.
def solution(N, number):
# N을 사용한 횟수로 만들 수 있는 모든 경우의 수
numbers = {x: set([int(str(N) * x)]) for x in range(1, 9)}
numbers[2].update([N+N, N-N, N*N, N//N])
for i in range(3, 9):
for j in range(1, i):
for op1 in numbers[j]:
for op2 in numbers[i-j]:
numbers[i].add(op1 + op2)
numbers[i].add(op1 - op2)
numbers[i].add(op1 * op2)
if op2 != 0:
numbers[i].add(op1 // op2)
if number in numbers[i]:
return i
# 8개까지 돌았는데 못 찾으면
return -1
암튼 수정해서 통과!
좀 신기한 건 이 문제는 다른 문제보다 점수를 많이 줬다! 왜지??? 그냥 level 3라서?🤔
제출 답안
def solution(N, number):
# N을 사용한 횟수로 만들 수 있는 모든 경우의 수
numbers = {x: set([int(str(N) * x)]) for x in range(1, 9)}
for i in range(1, 9):
for j in range(1, i):
for op1 in numbers[j]:
for op2 in numbers[i-j]:
numbers[i].add(op1 + op2)
numbers[i].add(op1 - op2)
numbers[i].add(op1 * op2)
if op2 != 0:
numbers[i].add(op1 // op2)
if number in numbers[i]:
return i
# 8개까지 돌았는데 못 찾으면
return -1
공부한 내용
set
저번에 공부했던 딕셔너리 선언 방식을 이용해서 처음부터 각 자리수만큼 붙어있는(?) 숫자가 들어있는 set을 선언해주려 했다. 그런데 처음엔 set(int(str(N) * x) 라고 했더니 TypeError: 'int' object is not iterable 오류가 났다.
그래서 list 형식처럼 [ ]로 감싸주니 해결.
지금까진 set( )으로만 선언해줘서 몰랐는데, set 안에 초기값으로 넣어줄 값이 있다면 iterable한 타입이어야 한다는 것~
numbers = {x: set([int(str(N) * x)]) for x in range(1, 9)}
print(numbers)
# N이 2일 때
# {1: {2}, 2: {22}, 3: {222}, 4: {2222}, 5: {22222}, 6: {222222}, 7: {2222222}, 8: {22222222}}
'코딩 테스트 스터디 > 프로그래머스' 카테고리의 다른 글
[level 2] 주차 요금 계산 (0) | 2022.08.01 |
---|---|
[level 1] 비밀지도 (0) | 2022.07.26 |
[level 3] 네트워크 (0) | 2022.07.23 |
[level 2] 게임 맵 최단거리 (0) | 2022.07.22 |
[level 2] 오픈채팅방 (0) | 2022.07.21 |