This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.
물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.
부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원해 줄 수 있는지 return 하도록 solution 함수를 완성해주세요.
제한사항
d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.
물품을 구매해 줄 수 있는 부서 개수의 최댓값을 return 하세요.
부서 // 예산 // 결과값
1,3,2,5,4 // 9 // 3
2,2,3,3 // 10 // 4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
와 같은 순서로 말을 하게 되며, 3번 사람이 자신의 세 번째 차례에 말한 tank라는 단어가 1번 사람이 자신의 첫 번째 차례에 말한 tank와 같으므로 3번 사람이 자신의 세 번째 차례로 말을 할 때 처음 탈락자가 나오게 됩니다.
입출력 예 #2
5명의 사람이 끝말잇기에 참여하고 있습니다.
1번 사람 : hello, recognize, gather
2번 사람 : observe, encourage, refer
3번 사람 : effect, ensure, reference
4번 사람 : take, establish, estimate
5번 사람 : either, hang, executive
와 같은 순서로 말을 하게 되며, 이 경우는 주어진 단어로만으로는 탈락자가 발생하지 않습니다. 따라서 [0, 0]을 return하면 됩니다.
입출력 예 #3
2명의 사람이 끝말잇기에 참여하고 있습니다.
1번 사람 : hello, even, now, draw
2번 사람 : one, never, world
와 같은 순서로 말을 하게 되며, 1번 사람이 자신의 세 번째 차례에 'r'로 시작하는 단어 대신, n으로 시작하는 now를 말했기 때문에 이때 처음 탈락자가 나오게 됩니다.
문제가 이정도 이다.
근데 막상 읽어보면 엄청 복잡한 문제는 아니다.
기초 로직을 생각하자면
첫 단어가 나오고 그 단어의 끝 글자와 다음 단어의 첫글자를 비교,
다를 경우 return하고
같을 경우 나온 단어(첫단어)를 빈 리스트에서 더한다.
그리고 다음 단어는 방금 더해진 리스트 내에서 유무를 확인하고 있으면 return, 없으면 위로 다시 진행.
만약 return이 안되고 다 돈다면 다 맞는 경우이니 return 0,0
알고리즘 자체는 어렵지 않다. 다만 결과값을 내는 방법에 대해 좀더 고민 중이다.
# 6월 18일 수정
결과값을 내는 방법 자체는 매우 쉽다.
몇번의 예시를 돌려보면 된다.
중요한 것은 결과값을 내기 위한 인덱스를 어떻게 지정하는가 이다.
처음에 내가 문제를 풀때는 인덱스를 0부터 시작하게 했다.
이렇게 할 경우 문제가 i번째에 걸리 수도 있고 또는 i+1번째에 걸릴 수도 있고, 이렇게 서로 다른 경우가 발생하다 보니
이 다른 경우를 해결 하기 위해 코드가 길어지고, 또 다른 경우가 발생하기도 했따.
(4번의 경우가 실패했따.. 아직도 이유는 모르겠지만 뭔가 틀렸겠찌)
그렇기에 코드를 간략히 하고 정확성을 높이기 위해 1부터 시작하고, 대신에 비교를 i-1로 하였다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다. 단, 땅따먹기 게임에는 한 행씩 내려올 때,
같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다.'''
지난번과 동일한 2레벨 문제이며 동적프로그래밍을 사용하면 된다고 해서 풀고 있다.
근데 여전히 어렵다.
다익스트라 알고리즘과 비슷하게 접근하면 될거 같은데...
# 땅따먹기 역시 동적 프로그래밍으로 풀었따.
내 힘으로 풀어서 너무 기분이 좋구나.. 좀 시행착오도 많긴했따.
문제는 이러하다
[[1,2,3,5],
[5,6,7,8],
[4,3,2,1]];
위와 같은 배열이 있을 때 열이 중복 안되게 하여 최대 값을 구하는 것이다.
이런 경우 5 + 7 + 4 = 16이 제일 큰 경우가 된다.
위에서 언급 했듯이 이는 다익스트라 알고리즘과 매우 유사하다.(최소냐 최대냐의 차이일뿐)
최대값을 비교하고 이를 업데이트 하는 동적프로그래밍 개념을 다시금 사용하였다.
처음에 이 문제를 접근하려 했을때는 동적프로그래밍을 염두 했음에도 불구하고 row, column을 제어하려고 노력하였다.
그리고 가장 잘못 생각했떤게, 한번에 max를 찾으려고 했다는 것이다.
무슨 의미냐면 1부터 시작할 경우, 6,7,8에 1을 더한 값을 구한 후 바로 3,2,1 에 이를 계산 하려고 했다.
모든 경우의 수를 다 생각을 해서 해야했기에 이는 최소 O(N^3) 의 시간 복잡도가 필요했을것이다
하지만 다익스트라를 보면
다익스트라는 한번에 마지막 노드까지 전진하지 않는다. 시작 노드에서 다음노드로, 또 해당노드의 값을 계산 하고 이를 업데이트 하고 넘어간다.
그렇기에 이 문제에서도 1번으로 6,7,8을 계산 한 후, 2번으로 다시 계산하고 값을 비교하고 업데이트 하는 식으로 하면 된다.
로직은 다음과 같다.
1. 처음 시작은 0번 로우의 원소들이다.
2. 2번 로우의 원소들과 비교한다
- 여기서 비교는 1번)(오리지널 원소)와 2번)(시작 노드 + 오리지날 원소 값)을 비교해서 1번)이 작으면 그 값을 2번으로 바꿔준다.
- 비교해야하는 주체가 필요하므로 나는 복제 테이블을 하나 만들어서 오리지널 원소는 복제테이블에서 뽑아오고 업데이트는 다른 리스트를 해주었다.
3. 반복.
1번에서 시작하면
[[1,2,3,5],
[5,6,7,8],
7,8,9 가 되고 모두 오리지널 보다 크므로 값이 바뀐다.
[4,3,2,1]];
바뀐후
[[1,2,3,5],
[5,7,8,9],
[4,3,2,1]];
이제 2번에서 시작한다.
[[1,2,3,5],
[5,7,8,9],
7, 9, 10 2번 + 2번째 원소들의 합이 오리지널보다 더 크다. 업데이트 하자.
[4,3,2,1]];
바뀐후
[[1,2,3,5],
[7,7,9,10], 7은 2번과 같은 인덱스이므로 문제의 규칙에 따라서 적용되지 않았다.
[4,3,2,1]];
다음은 3번이다.
[[1,2,3,5],
[7,7,9,10],
8, 9, , 11 역시 모두 큰 값이므로 업데이트 해준다
[4,3,2,1]];
이렇게 반복을 하면 된다.
코드 상에서 row를 움직이기 위해 변수를 하나 선정한후 while로 돌렸다.
이게 최선의 코드는 아니나 효율성에서도 큰 문제 없이 돌아갔다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters