바위타는 두루미

16.11 다이빙 보드 본문

Study/Algorithm

16.11 다이빙 보드

DoRoMii 2019. 8. 14. 13:36
728x90

문제

다량의 널빤지를 이어 붙여서 다이빙 보드를 만들려고 한다. 널빤지는 길이가 긴 것과 짧은 것 두가지 종류가 있는데 정확히 K개의 널빤지를 사용하여 다이빙 보드를 만들어야 한다. 가능한 다이빙 보드의 길이를 모두 구하는 메서드를 작성하라

 

해결법

1. 재귀적 해법

재귀적으로 K번의 널빤지를 선택하면 다이빙 보드를 완성할 수 있고 완성된 보드를 리스트에 추가하면 된다. 

+ 메모이제이션 

def getAllLengths(k, long, short):
    memo = set()
    lengths = set()

def allLengths(k, lengths , total, long, short, memo):
    if k == 0:
        lengths.add(total)
    key = (total, k)
    if key in memo :
        return
    allLengths(k-1, lengths, total+long, long, short, memo)
    allLengths(k-1, lengths, total-short, long, short, memo)
    memo.add(key)
    return

 

2. 수열의 합만을 구하기

 어쩌피 널빤지는 2가지종류밖에 없으니 나올수 있는 경우의 수는 K+1밖에 없다.

K = 7이면 long이 0개일때 shourt는 7, long이 1개일때 shourt는 6, ... 이런식으로

그러면 그냥 loop를 이용해서 구할 수 있다. 

 하지만 한가지 생각해야할 부분이 있다. 두 판자의 길이가 같은 경우를 생각해야한다 

그런경우에는 원소가 하나인 배열을 반환하면 된다!!

def getAllLengths(k, long, short):

    lengths = []
    cnt_s = k
    if long != short:
        while cnt_s >=0 :
            cnt_l = k - cnt_s
            length = long*cnt_l + short*cnt_s
            lengths.add(length)
            cnt_s -=1
    else :
        return [long*k]
    return lengths

 

'Study > Algorithm' 카테고리의 다른 글

[leetcode]29. Divide Two Integers  (0) 2019.08.15
[leetcode]120. Triangle  (0) 2019.08.15
16.10 살아있는 사람  (0) 2019.08.14
16.1 숫자 교환  (0) 2019.08.14
[leetcode]300. Longest Increasing Subsequence  (0) 2019.08.11
Comments