[코딩테스트]동적계획법

쟈니·2023년 4월 3일
0

프로그래머스 : N으로 표현

def solution(N, number):
    possible_set = [0,[N]] 
    # 조합으로 나올수 있는 가능한 숫자들, 여기에 계속 append하며 이후에 사용함
    if N == number: #주어진 숫자와 사용해야 하는 숫자가 같은 경우는 1개면 족하므로 1으로 놓는다. 
        return 1
    for i in range(2, 9): 
    # 2부터 8까지로 횟수를 늘려 간다. 
        case_set = [] 
        # 임시로 사용할 케이스 셋, 각 I 별로 셋을 만들어 possible set에 붙인다.
        basic_num = int(str(N)*i) 
        # 같은 숫자 반복되는 거 하나를 추가한다.
        case_set.append(basic_num)
        for i_half in range(1, i//2+1): 
        # 사용되는 숫자의 횟수를 구해야 하는데, 절반 이상으로 넘어가면 같은 결과만 나올 뿐이므로 절반까지만을 사용한다. 
            for x in possible_set[i_half]:
                for y in possible_set[i-i_half]: 
                # x와 y를 더하면 i 가 되도록 만든 수다. 
                    print(possible_set)
                    case_set.append(x+y)
                    # 각 사칙연산 결과를 더한다.
                    case_set.append(x-y)
                    case_set.append(y-x)
                    case_set.append(x*y)
                    if y !=0:
                        case_set.append(x/y)
                    if x !=0:
                        case_set.append(y/x)
            if number in case_set:
                return i
            possible_set.append(case_set) 
            # 최종 결과물 set에 사칙 연산 결과를 더한다.
    return -1 
    #N 이 8까지 답이 없으면 -1을 출력한다.

접근방식

![]

후기

다른 사람의 접근 방식 활용

  • 특정 숫자만큼 5를 사용한 조합을 만들때, 덧셈 조합의 겨우의 수끼리 사칙연산을 해준다.
  • 최대 수가 8이기 대문에 연산을 많이 하지 않아 append와 사칙연산 반복이 가능

프로그래머스 : 정수 삼각형

def solution(triangle):
    # dp 테이블 초기화
    dp = [[0] * len(triangle) for _ in range(len(triangle))]
    dp[0][0] = triangle[0][0]
    # 거쳐간 숫자의 최댓값 구하기
    for i in range(0, len(triangle) - 1):
        for j in range(len(triangle[i])):
            dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + triangle[i + 1][j])
            dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + triangle[i + 1][j + 1])

    return max(dp[-1]) 
    # dp 테이블의 마지막 원소들 중 최댓값 반환

접근방식

![]

후기

  • triangle 이중배열 테이블 만들고 이전 경로값을 저장
  • 이중배열로 가장 큰 값으로 반환

프로그래머스 : 등굣길

def solution(m, n, puddles):
    answer = 0
    
    arr = [[0 for y in range(m+1)] for x in range(n+1)]
    puddles_arr = [[0 for y in range(m+1)] for x in range(n+1)]
    for puddle in puddles:
        puddles_arr[puddle[1]][puddle[0]] = 1
    
    arr[1][1] = 1
    for x in range(1, n+1):
        for y in range(1, m+1):
            if x == 1 and y == 1:
                continue
            if puddles_arr[x][y] == 1:
                continue
            else:
                arr[x][y] = (arr[x-1][y] + arr[x][y-1]) % 1000000007

    return arr[n][m]

접근방식

![]

후기

profile
시작은 미미하나 끝은 쥬쥬하다.

0개의 댓글