일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- CLI
- slice
- codingtest
- Javascript
- Array
- Reduce
- 노드
- nodejs
- 마음커넥션
- Programmers
- 노드제이에스
- 타입스크립트
- node
- Method
- 개발
- indexOf
- error
- 에러
- Nextjs
- 백엔드
- react
- 앵귤러
- 노드js
- 자바스크립트
- TypeScript
- npm
- angular
- 코딩테스트
- 코딩테스트연습
- 프로그래머스
- Today
- Total
Suzie's Blog
[프로그래머스] 등차수열의 특정한 항만 더하기 (JavaScript) 본문
항상 하던대로 컴퓨터를 켜자마자 프로그래머스 웹사이트에 접속해서 기초 알고리즘 문제를 풀어보려고 하였다.
근데 문제 자체를 이해하지 못하겠는거.. ㅠㅠ

수학 공부 안한지 벌써 몇만시간이 흐른거 같은데 ㅋㅋㅋㅋㅋ 등차수열? 공차? 이름은 익숙하나 등차수열이 뭐였는지 기억도 안난다.. 이런 나와같은 상황에 마주친 분들에게 도움을 주고자 그리고 나 자신도 공부해보기 위해 이 포스트를 작성하게 되었다..!
일단 제목부터 분석 해보자!
"등차수열의 특정한 항만 더하기"
등차수열이란?
1,3,5,7,9.... 처럼 연속한 두 항의 차가 일정한 수열을 등차수열이라고 함.
공차란?
연속한 두 항에서, 뒤 항에서 앞 항을 뺀 값을 공차(Common difference)라고 함
예를 들면, 1,3,5,7,9의 공차는 2 이다. (3-1 / 5-3 / 7-5 ...)
자 이제 등차수열과 공차가 무엇인지 알았으니 문제를 읽어보자!
문제 설명
두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.
입출력 예
a d included resul 3 4 [true, false, false, true, true] 37 7 1 [false, false, false, true, false, false, false] 10
자.. 아직도 모르겠다 ㅋㅋ
한문장씩 해석해보자
//두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다.
const a = 3
const d = 4
const included = [true, false, false, true, true]
//result = 37
//첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때,
//이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는
//solution 함수를 작성해 주세요.
//첫째 항이 a라면 3부터 시작하고 공차가 4면 두번째 수는 7이 되겠군
//[3,7,11,15....]
//included[i] + 1 => 이 부분은 컴퓨터의 세계에서는 1부터 세지 않고 0부터 세기 때문에
//1을 더해주어 1항이 배열의 1번째와 매치될 수 있게 한 것같음
//결론적으로
//첫째항 a와 공차 d를 이용해서 해당 배열을 생성 한 후, true인 항만 filter해서 return하면 되는 문제!
//이렇게 분석하니까 비로소 이해 가능!!
이렇게 하나씩 분석하니까 문제 이해 완료!
내가 푼 풀이
function solution(a, d, included) {
const arr = new Array(included.length).fill(a);
const arithmeticSequence = arr.map((ele,i) => ele+i*d);
return arithmeticSequence.filter((ele,i)=> included[i]).reduce((acc,cur)=>acc+cur)
}
1. new Array로 included의 length만큼 a로 채워준다 // [3,3,3,3,3]
2. arithmeticSequence 변수에 1번에서 i*d (배열의 인덱스 * d(4))를 더해준 배열 생성 // [ 3, 7, 11, 15, 19 ]
3. filter를 이용해서 included 배열에서 같은 index의 값이 true인 것만 filter // [3, 15, 19]
4. reduce를 이용해서 filter된 값 모두 더해준 후 return // 3+15+19 = 37
오늘도 문제풀이 성공!
하지만 다른사람의 풀이를 보고 또 충격을 먹었.. (세상에 똑똑한사람 진짜 많다!!)

인상 깊었던 다른사람의 풀이
function solution(a, d, included) {
return included.reduce((acc, flag, i) => {
return flag ? acc + a + d * i : acc
}, 0)
}
분석해보자!
이 분은 reduce를 사용해서 한번에 문제를 풀었는데
acc는 축적된 값
flag는 각 배열의 값
i는 index값을 이용하여 문제를 풀었다.
flag가 true일 때, acc + a + d*i을 하였고
false일 때는 acc를 그대로 반환.
true일때의 값만 축적시켜서 결과를 리턴!
역시 메서드 사용방법을 잘 알아야 풀 수 있는 문제!
reduce로 각 배열의 합만 구할 줄 알았지 index까지 사용하는 방법을 몰랐었다.
오늘도 문제풀이 완성!
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 문자열 뒤집기(JavaScript) (0) | 2023.11.09 |
---|---|
[프로그래머스] 수열과 구간 쿼리1 (JavaScript) (0) | 2023.10.25 |
[프로그래머스] 문자열 돌리기(JavaScript) (2) | 2023.10.19 |
[프로그래머스] 가까운 1 찾기 (JavaScript) (0) | 2023.09.20 |
[프로그래머스] 배열의 원소만큼 추가 (0) | 2023.09.04 |