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 등 다양한 자바 프레임워크에 대해 다시 복기하기 위해 링크를 남겨둡니다...
저도 까먹기도하고 매번 서칭하다보니... 휴 열심히 해야겠어요.
*이제 엘리트 분들의 답안을 감상하자... *
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인듯하네요.. 신기하군요.. 갓 파이썬.. 꼭 공부해야지.. 휴
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를 통해서 합들을 구해준뒤, 반복문을 통해서 제일 큰 값을 추출하는듯합니다... (할게 너무 많다..)
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'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 |