문제
문제 설명
과자를 바구니 단위로 파는 가게가 있습니다. 이 가게는 1번부터 N번까지 차례로 번호가 붙은 바구니 N개가 일렬로 나열해 놨습니다.
철수는 두 아들에게 줄 과자를 사려합니다. 첫째 아들에게는 l번 바구니부터 m번 바구니까지, 둘째 아들에게는 m+1번 바구니부터 r번 바구니까지를 주려합니다. 단, 두 아들이 받을 과자 수는 같아야 합니다(1 <= l <= m, m+1 <= r <= N). 즉, A[i] 를 i번 바구니에 들어있는 과자 수라고 했을 때, A[l]+..+A[m] = A[m+1]+..+A[r]
를 만족해야 합니다.
각 바구니 안에 들은 과자 수가 차례로 들은 배열 cookie가 주어질 때, 조건에 맞게 과자를 살 경우 한 명의 아들에게 줄 수 있는 가장 많은 과자 수를 return 하는 solution 함수를 완성해주세요. (단, 조건에 맞게 과자를 구매할 수 없다면 0을 return 합니다)
제한사항
- cookie의 길이는 1 이상 2,000 이하입니다.
- cookie의 각각의 원소는 1 이상 500 이하인 자연수입니다.
예시 입출력
cookie | result |
---|---|
[1,1,2,3] | 3 |
[1,2,4,5] | 0 |
문제 해결
answer 라는 변수에 경우의 수를 모두 탐색하면서 최대값을 담는 작업을 했다.
가능한 모든 경우를 탐색하는 방법은 cookie 배열을 순회하면서 l 변수와 m 변수에 index와 index+1의 값을 담고 l은 index를 1씩 줄이고 m은 index를 1씩 늘려가면서 비교한다. 그러다가 둘중 하나라도 index 가 0이 되거나 cookie 배열의 마지막이 되면 탐색을 종료하고 다음 경우를 구했다.
늘리는 중간중간에 둘의 값을 검사해 둘이 같다면 answer와 큰값을 비교해 대입하였다.
javascript 코드
const {
max
} = Math
const solution = (cookie) => {
let answer = 0
let len = cookie.length
if (len == 1) {
return 0
}
for (let i = 0; i < len - 1; i++) {
let l = i
let m = i + 1
let cookie1 = cookie[l]
let cookie2 = cookie[m]
let flag = true
if (cookie1 == cookie2) {
answer = max(cookie1, answer)
}
while (flag) {
if (l > 0 && cookie1 <= cookie2) {
l--
cookie1 += cookie[l]
} else if (m < len - 1 && cookie1 >= cookie2) {
m++
cookie2 += cookie[m]
} else {
flag = false
}
if (cookie1 == cookie2) {
answer = max(answer, cookie1)
}
}
}
return answer
}
느낀점
처음에 문제 풀이에 대한 감이 오지않아 질문하기에 있는 코드를 보고 이해한 후 로직을 구현하였다. 간단한 로직이였는데 조금 더 생각해보고 다른 해결방법을 찾는 힘을 길러야겠다.
'Study > Algorithm' 카테고리의 다른 글
[2018 서머코딩] 영어 끝말잇기 (1) | 2019.06.12 |
---|---|
[2018 서머코딩] 숫자게임 (0) | 2019.06.12 |
[2018 윈터코딩] 방문 길이 (0) | 2019.06.12 |
[2018 윈터코딩] 스킬트리 (0) | 2019.06.12 |
[BOJ] 2225 - 합분해 (0) | 2019.06.04 |