n보다 커질때까지 더하기
배열 numbers가 주어지고 정수 n이 정해진다.
numbers 배열 내의 숫자를 앞에서부터 하나씩 더하다가 합이 정수 n보다 커지는 순간 이 때까지 더했던 합을 return
하는 문제였다.
여기서 나는 for문과 reduce를 사용하고자 했다.
for문으로 완성해보고, reduce를 사용해보는 식으로!
처음 예제부터 0이라는 숫자를 맨 처음 가지고 더한다고 설명히 되어 있었다.
그래서 그러면
for(let i=0; i<=numbers.length; i++){
answer += nubers[i]
if(answer > n){
return answer
}
}
라고 먼저 짯다.
그래놓고 프로그래머스에는
for(let i=0; i<=numbers.length; i++){
answer =+ nubers[i]
answer > n
}
return answer
로 적은것. 오메,,, 이게 뭔일이람...?
answer =+ 로 변경해도 if문을 사용하지 않았기 때문에 내가 원하는 값은 받을 수 없었다.
조건문은 참 중요한 거구나.. 하면서 if문을 사용해서 풀어보니
내가 원하는 값을 받을 수 있었다.
function solution(numbers, n) {
var answer = 0;
for (let i = 0; i<numbers.length; i++){
answer += numbers[i]
if( answer > n){
break;
}
}
return answer;
}
for문을 이용해 푼 사람들과 비교했을 때 내 코드에서 n보다 큰 수를 찾는 코드가 다른게 있다면 answer <= n인 사람이 많았던것?? 왜 그렇게 풀어야 하는 거지?
하다가 while로 푼 사람의 풀이를 봤다.
그래 반복문은 while도 있었지 하고 뜯어봤다.
while (ans<=n) ans+=numbers.shift();
shift를 이렇게 사용할 수 있을 줄은 몰랐다.
while문을 사용하는 동안 ans가 n보다 작은지 확인하는 동작을 계속 하면서
ans에 numbers 원소를 순차적으로 더하는데, 그 더하는 원소는 도하면 삭제되는 구조라니.
이걸 작성한 분 대단하다고 생각했다.
그리고 내가 reduce로 풀어보려 했는데 나는 reduce를 해도 이상하게 나왔다.
모든 것을 더하는 식은 외웠으니까 잘 적을 수 있었다. 그래도 여기에 조건을 적으면 되지 않을까? 하고 쉽게 생각했는데..
numbers.reduce((a,c)=> a+c>n,0)
이라 했는데 자꾸 false만 나왔다.
뭐가 잘못됐다 싶어서 numbers.reduce((a,c)=> a+c,0)을 하니 전체 값은 잘 더해졌다.
뭑가 문제일까 하고 numbers.reduce((a,c)=>{(a+c>n) ? a+c : a+c},0)를 했는데 undefind 떳다.. 왤까 하다가
var answer = numbers.reduce((a,c)=> (a<=n ? a+c : a),0);
이렇게 작성한 분의 코드를 봤다.
나는 조건을 a+c가 n보다 커지면 a+c의 값을 반환하거나 커지지 않아도 a+c의 값을 내놓으라고 했다.
게다가 중괄호와 소괄호가 쓰이는 것도 달랐다.
그렇다면 정답처리가 된 분의 코드를 뜯어보니 누적값(a)가 n보다 이하인지를 확인하고 이하면 배열의 원소를 계속 더하고, 넘으면 누적값(a) 를 반환한다는 코드였다.
다른 for문, while문을 사용한 사람들도 모두 조건이 a가 n보다 작으면 더하고 넘으면 a를 반환한다는 조건이 많았다.
이 문제는 n보다 큰 수를 구하기 위해선 그 전에 n보다 작을 때는 다 더해야 한다는 전제가 필요한거였다.
인간이라면 당연히 여기는 생각이었는데 컴퓨터는 인간이 당연하다 한것도 명시해 줘야 한다. 를 다시 한번 유념해야 한단 걸 깨닳을 수 있었다.
'자기개발 > TIL' 카테고리의 다른 글
js에서 양의 정수를 받아 배열로 만들기 (0) | 2023.07.07 |
---|---|
js 조건문을 연습하는 줄 알았는데 새로운 매소드를 알았다. (0) | 2023.07.06 |
배열에서 음수의 인덱스를 반환하란다 (0) | 2023.07.04 |
자바로 구현한 좋아요 많은 순서대로 반환 회고하기 (0) | 2023.06.28 |
영어 면접을 봤습니다. (0) | 2023.06.27 |