본문 바로가기

Study/Algorithm

[2018 윈터코딩] 쿠키 구입

문제

문제 설명

과자를 바구니 단위로 파는 가게가 있습니다. 이 가게는 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