본문 바로가기
자기개발/TIL

리스트 연습

by 금화맘 2023. 7. 5.

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보다 작을 때는 다 더해야 한다는 전제가 필요한거였다. 

인간이라면 당연히 여기는 생각이었는데 컴퓨터는 인간이 당연하다 한것도 명시해 줘야 한다. 를 다시 한번 유념해야 한단 걸 깨닳을 수 있었다.