코딩 테스트 스터디/프로그래머스

[level 3] N으로 표현

남쪽마을밤송이 2022. 7. 24. 21:54

 문제 

https://school.programmers.co.kr/learn/courses/30/lessons/42895?language=python3#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 사용 언어 

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