본문 바로가기
알고리즘

[프로그래머스][JS] Lv.1 음양 더하기

by codnjs779 2022. 9. 22.

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 
제한사항
  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.
입출력 예
[4,7,12] [true,false,true] 9
[1,2,3] [false,false,true] 0

 

A. 생각한 풀이과정 

1. 두 배열을 새로운 객체로 만들기

2. 반복문 사용해서 두 배열을 비교해서 false 일 경우 음수로 만들고 만들어진 값들 새 배열에 넣기

3. 새 배열 계산 

 

처음 생각한 방법은 위와 같은데, 두 배열을 비교하는 반복문을 쓰기보다, Boolean 배열을 키로 생각하고 Number 배열의 값을 비교하는 게 나을 거 같다는 생각이 들어서...(그게 그거일 수도 😥,,,) 사실 뭐가 나은지 확신은 없지만 그래도 뭔가 

새로운 방법을 사용해보고 싶어서 결국엔 do while 문을 사용해서 원하는 배열값을 얻는 방향으로 풀이 방법을 정했다.

 

B. 해결과정 

1. 빈 배열 선언, 루프 돌려줄 i 초기값 설정

const solution = () => {
    let newObj = []
    let i = 0;
   
}

2. do while문을 사용해서 false 인 값에 *-1을 해서 음수 변환한 배열 리턴 

const solution = () => {
    let newObj = []
    let i = 0;
     do {
         newObj.push(signs[i] === false ? absolutes[i]*-1 : absolutes[i])
         i += 1
     } while(absolutes.length > i)

}

3. 조건문 돌려준 후 얻은 newObj를 reduce함수 사용해서 더해주기 

const solution = () => {
    let newObj = []
    let i = 0;
     do {
         newObj.push(signs[i] === false ? absolutes[i]*-1 : absolutes[i])
         i += 1
     } while(absolutes.length > i)
    const sum = newObj.reduce((a,b) => a+b)
    return (sum)
}

결과가 잘 나오긴 했음!! 다른 사람 풀이를 보기 전까지는 나름 나도 잘 쓴 거 같다고 생각했는데 더 간단한 방법이 있었음.

reduce함수 인자에 i를 넣어서 해당 값이 배열 순서를 나타내는 지표로 사용되도록 한 방법이 있었음.

 

function solution(absolutes, signs) {

    return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}

참 깔끔하다,,! ㅎ 위와 같은 방식으로 하면 do while문을 써주지 않아도 되어서 훨씬 코드가 축약된다.