본문 바로가기
알고리즘 공부/ps

[프로그래머스] N으로 표현

by 지금갑시다 2024. 2. 26.

 

문제

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 과 같은 연산도 해줘야 하기 때문이다.

두 값의 결과가 다르게 나옴!

 

 

이거.. 너무 어렵다..

컴퓨터적 사고..