ta_chan 2023. 6. 14. 20:28

음양 더하기

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

 

나의 코드 :

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        //solution 배열의 값을 확인한다.
        //만약 signs의 값이 true면 양수, false면 음수를 뜻한다.
        // 구해진 값을 모두 합해서 리턴    
        int answer = 0;
        for(int i=0; i<absolutes.length;i++){
            if(signs[i]==false){
                absolutes[i]=-absolutes[i];
            }
            answer += absolutes[i];
            
        }
        return answer;
    }
}

코드1 :

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        int arrLength = absolutes.length;

        for(int i=0;i<arrLength;i++){
            if(signs[i]){
                answer += absolutes[i];
            }else{
                answer -= absolutes[i];
            }
        }

        return answer;
    }
}

이 코드에서는 signs의 타입형태를 이용했다.

그래서 signs[i]의 값이 true이면 answer에 더하고,

signs[i]값이 false이면 answer에서 값을 뺀다.

내 코드에는 한쪽의 조건만 명시함에 비해

이 코드는 간결하게 true일때와, false일때를 명시했다.

코드2:

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        for (int i=0; i<signs.length; i++)
            answer += absolutes[i] * (signs[i]? 1: -1);
        return answer;
    }
}

이 코드는 삼항연산자를 이용해서 코드를 if문을 따로 적지 않고 표현했다.

signs 자체를 true냐 false냐 라는 조건식을 통해서 absolute[i]에 1을 곱하느냐, -1을 곱하느냐,

즉 양수냐 음수냐를 정해서 answer에 더한다.

앞서 두 코드를 보면서 signs[i] 자체를 조건문으로 보고 코드를 짰다는것이 새로웠다.

또 마지막코드에서는 양수, 음수를 1과 -1로 구분하여 absolutes[i]에 곱하여 양,음수를 구현했다는것이 새로웠다.

내 코드는 필요한것만 적어서 직관적으로 보였고

두번째 코드는 양수인 조건, 음수인 조건을 모두 명시하여 명확하고 직관적으로 보였고

세번째 코드는 삼항연산자가 익숙하지 않은 나에게는 읽는데 익숙하지는 않아 한번에 보기는 힘들었지만, 코드가 간결하고 아이디어가 참신했다.

하지만 어떤 코드가 좋은 코드인지는 잘 모르겠다. 

삼항연산자를 쓴 코드가 가장 간결하며 직관적이지만

삼항연산자가 익숙하지 않은 나에게는 두번째 코드가 더 명확하게 다가온다.

그렇다면 무엇이 더 좋은 코드일까?

초보자도 알아볼수있어야 좋은 코드일까?

어떻게 해야 나도 좋은 코드를 만들 수 있을까?

 

제일 작은 수 제거하기

💡 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        if (arr.length == 1) return new int[]{-1}; // 배열의 길이가 1이면 -1을 반환

        int min = Arrays.stream(arr).min().getAsInt(); // 배열에서 최소값 찾기
        return Arrays.stream(arr).filter(i -> i != min).toArray(); // 최소값이 아닌것들만 배열생성
    }
}

여기서 filter() 는 조건문이 참인 경우를 구현한다.

만약 참과 거짓에 따른 결과를 다르게 두려면 boxed()로 Wrapper 클래스로 변환하여 map() 사용해서 람다를 구현한다.

public int[] solution(int[] arr) {
    int min = Arrays.stream(arr).min().getAsInt(); // 배열에서 최소값 찾기
    int[] minArray = Arrays.stream(arr).filter(i -> i != min).toArray(); // 최소값을 제외하고 새 배열 생성
    return  minArray.length == 0 ? new int[]{-1} : minArray; // 배열의 길이가 0이면 -1을 반환하고, 그렇지 않으면 필터링 된 배열을 반환
}

정리

  • filter()는 특정 조건이 만족하는 요소만 선택하여 새로운 스트림을 만든다.
  • map()은 각 요소에 특정 함수를 적용하여 그 결과를 기반으로 새로운 스트림을 만든다.
    • 기본형에는 map이 불가능하므로 Wrapper 클래스로 변한한다.