greenhelix
greenhelix
greenhelix
06-21 21:56
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#37_Code Signal Arcade >> Array Max Consecutive Sum
Algorithm/Java

#37_Code Signal Arcade >> Array Max Consecutive Sum

2020. 3. 4. 00:00

Code Signal -Arcade

코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.

주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...

되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요! \


*Array Max Consecutive Sum *

배열에서 연속되는 수들의 합이 가장 큰 것을 구하라

문제의 내용은 주어진 숫자배열에서 k갯수의 연속된 요소들의 합이 가장 큰 것을 리턴하라는 문제입니다.

예시를 보면 이해가 되시나요.

k = 3이라면, 세개의 연속되는 요소들을 뽑아서 가장 큰 합을 리턴하라는 것이죠.

답안을 볼까요?

int arrayMaxConsecutiveSum(int[] input, int k) {
    List sum = new ArrayList(input.length);
    int result = 0, q =0; 
    for(int i = k; i<=input.length; i++){  
        result = 0; 
        for(int j=q; j<k+q; j++){
             result += input[j];
        }
        sum.add(result);
        q++;      
    }
  return result = (int)Collections.max(sum);
}

    List sum = new ArrayList(input.length);
    int result = 0, q =0; 

일단 list로 선언을 해줍니다.

합을 나타내줄 result를 선언해주고요.

q는 반복문에서 사용되는 인자값입니다.

    for(int i = k; i<=input.length; i++){  
        result = 0; 
        for(int j=q; j<k+q; j++){
             result += input[j];
        }
        sum.add(result);
        q++;      
    }

반복문입니다.

k를 i로 선언후, 안쪽 for문에다가 q값을 넣은후 범위를 k+q로 하여 설정해줍니다.

이렇게 한뒤 result += input[j]를 반복하여

result를 한 세트 구한뒤, 이것을 sum 리스트에 넣어줍니다.

그러면, 각 요소번째에서 k번째 연속되는 수들의 합이 들어갑니다.

결론적으로 sum리스트에는 각 경우의 합들이 들어가게 됩니다.

q++를 통해 다음요소번째로 넘어가 시작점을 바꿔주는 것이죠.

이렇게 보면, 처음 i = k로 설정한 이유가 좀 이해가 되실겁니다.

배열의 길이가 4라고 가정했을때, k=2 라면, 총3개의 합이 나와야 하죠.

그것을 딱 범위에 맞게 해주기 위해 설정했습니다. (다시보니,,, 좀 어렵게 했네요 뭔가 더 쉽게 할 수 있을듯)

return result = (int)Collections.max(sum);

마지막 리턴 부분입니다. 이제 sum 리스트에 합들을 넣어줬으니, 최종적으로 그 중 가장 큰 값을 리턴 시키면 끝

여기서는 collections를 통해서 list안에 최대 값을 리턴하는 것으로 하였습니다.

(int)를 통해 형변환도 잊지 마시구요. ^^

Collections 와 기타 list / set/ map 등 다양한 자바 프레임워크에 대해 다시 복기하기 위해 링크를 남겨둡니다...

 

Collections Framework - 생활코딩

배열과 컬렉션즈 프레임워크 이전 시간에 배열에 대해서 공부했다. 배열은 연관된 데이터를 관리하기 위한 수단이었다. 그런데 배열에는 몇가지 불편한 점이 있었는데 그 중의 하나가 한번 정해진 배열의 크기를 변경할 수 없다는 점이다. 이러한 불편함을 컬렉션즈 프래임워크를 사용하면 줄어든다. 아래의 예를 보자. package org.opentutorials.javatutorials.collection; import java.util.ArrayList; publi

opentutorials.org

 

저도 까먹기도하고 매번 서칭하다보니... 휴 열심히 해야겠어요.


*이제 엘리트 분들의 답안을 감상하자... *

JAVA

int arrayMaxConsecutiveSum(int[] inputArray, int k) {
    int s = 0, ma;
    for(int i = 0; i < k; i++) s += inputArray[i];
    ma = s;
    for(int i = k; i < inputArray.length; i++) {
        s += inputArray[i] - inputArray[i - k];
        ma = Math.max(ma, s);
    }
    return ma;
}

Math클래스를 통해서 이분은 해결한거같네요.. 좀 뭔가 복잡해보이지만 간단해보입니다...

Python3

def arrayMaxConsecutiveSum(a, k):
    c = m = sum(a[:k])

    for i in range(len(a) - k):
        c = c + a[i + k] - a[i]
        m = max(c, m)

    return m

파이썬의 경우 항상 느끼지만 간결하고 괄호와 마침표가 없어서 너무 좋은거 같아요.. inputArray를 a 로 바꿔서 푸셨네요. 글자 긴거 싫어하시는듯..

[:k] 이 indexing인듯하네요.. 신기하군요.. 갓 파이썬.. 꼭 공부해야지.. 휴

 

파이썬 - Numpy : array 인덱싱.

저번에 이어서 array로 인덱싱 하는 방법을 연습해보겠다. jupyter notebook을 실행하고~ 먼저 numpy를 호...

blog.naver.com

JS

function arrayMaxConsecutiveSum(inputArray, k) {
    s = m = inputArray.slice(0,k).reduce((x,y) => x+y)
    for (i = k; i < inputArray.length; i++) {
        s += inputArray[i] - inputArray[i-k]
        if (s > m) {m = s}}
    return m}

역시 자바스크립트... slice 를 사용한뒤, reduce를 통해서 합들을 구해준뒤, 반복문을 통해서 제일 큰 값을 추출하는듯합니다... (할게 너무 많다..)


공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!

부탁드려요 돈드는거 아니잖아요~

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

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

#38_Code Signal Arcade >> Growing Plant  (0) 2020.03.05
#36_Code Signal Arcade >> Different Symbols Naive  (0) 2020.02.23
#35_Code Signal Arcade >> First Digit  (0) 2020.02.19
    'Algorithm/Java' 카테고리의 다른 글
    • #39_Code Signal Arcade >> Knapsack Light
    • #38_Code Signal Arcade >> Growing Plant
    • #36_Code Signal Arcade >> Different Symbols Naive
    • #35_Code Signal Arcade >> First Digit
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바