[오늘의 문제] 음양 더하기

shlim55·2025년 4월 11일

코딩테스트

목록 보기
24/223

출처: https://school.programmers.co.kr/learn/courses/30/lessons/76501

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

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

signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
따라서 세 수의 합인 9를 return 해야 합니다.
입출력 예 #2

signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
따라서 세 수의 합인 0을 return 해야 합니다.

15분 내에 푸는걸로 목표를 하고 풀었다.

class Solution {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
// 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수

    // 1 이상 1,000 이하
    // 양수면 true 음수면 false 
    for (int i = 0; i < absolutes.length; i++){
        //for(int j = 0; j < absolutes.length; j++){
            if(signs[i] == true){// true 일때 absolute[i]는 양수 false일때 음수이다.
                absolutes[i] = 1 * absolutes[i];
            } else {
                absolutes[i] = -1 * absolutes[i];
            }
        //}
    }
    // 각 배열원소의 합을 더한다.
    for(int i = 0; i < absolutes.length; i++){
        answer += absolutes[i];
    }
    
    return answer;
}

}
15분내로 작성한 코드문이다.
우선 처음에는 이중 반복문이 있어야 한다고 판단했다.
왜냐면 absolutes배열만큼이나 signs 배열길이도 같아야 하기 때문에 그런 생각을 했던것 같다.
"두 배열을 동시에 비교하려면 이중 반복문이 필요하지 않을까?"라는 생각을 했다.

제출을 할때 2개 빼고 다 통과가 되었다.

왜그런지 생각해보니.

저렇게 이중 반복문이 있으면, i가 한 번 바뀔 때마다 j가 absolutes.length만큼 돈다.

하지만 signs[i]를 조건으로 absolutes[i]를 바꾸는 작업은 한 번만 하면 되는데, j 루프만큼 중복으로 실행됨.

사실상 absolutes.length번씩 같은 요소를 다시 바꾸고 있는 셈이니까 시간 낭비 + 의미 없는 연산이 되는 거다.

그래서, 안쪽 반복문을 주석처리 하니 통과가 되었다.

더 수정하자면, 이렇게도 바꿀수 있다.

class Solution {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
// 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수

    // 1 이상 1,000 이하
    // 양수면 true 음수면 false 
    for (int i = 0; i < absolutes.length; i++){
            if(signs[i] == true){// true 일때 absolute[i]는 양수 false일때 음수이다.
                answer += 1 * absolutes[i];
            } else {
                answer += -1 * absolutes[i];
            }
    }
    
    return answer;
}

}

profile
A Normal Programmer

0개의 댓글