본문 바로가기

TIL(Today I Learned)

TIL-230617([프로그래머스/자바] 없는 숫자 더하기)

📌진행방식

⛔문제점

[내가 작성한 코드]

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        int answer = -1;
        
        List<Integer> intList = new ArrayList<>();
        for(int i=0;i<10;i++){
            intList.add(i);
        }

        for(int num: numbers){
            if(intList.contains(num)){
                intList.remove(num);
            }
        }
        answer = 0;
        for(int num2:intList){
            answer += num2;
        };
        
        return answer;
    }
}

 

 

[에러메시지]

 

시도해 본 것들💦

- 처음에 배열에 해당 숫자들이 포함되어 있는지를 확인해야 겠다는 생각에 contains를 써야겠다고 생각했다. 그러고 포함된 숫자를 제거한 뒤 더해야겠다고 생각해 remove를 사용하였다. 바로 비교가 가능하다고 생각했는데 'IndexOutOfBoundsException'에러가 나왔다. ArrayList는 요소를 삭제할 때 내부적으로 크기를 조정하는데, 이때 ArrayList의 크기를 동적으로 조정해주지 않아 발생한 오류라고 한다.

 

💯해결

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        int answer = -1;
        
        List<Integer> intList = new ArrayList<>();
        for(int i=0;i<10;i++){
            intList.add(i);
        }

        for(int num: numbers){
            if(intList.contains(num)){
                intList.remove(Integer.valueOf(num));
            }
        }
        answer = 0;
        for(int num2:intList){
            answer += num2;
        };
        
        return answer;
    }
}

 - TIL을 쓰다 보니 Integer.valueOf(num) 대신에 indexOf(num)을 쓸걸,,,하는 생각이 들었다.......ㅎ......

 

개선할 점💪🏻

 - 이것저것 구글링 해보다가 valueOf()로 가능하다는 걸 알았다. 그런데 Integer의 Wrapper객체가 필요하지 않는데 불필요하게 코드를 짰다. 다른 사람의 코드를 보니 엄청 간단하게 코드를 구현하였다.

class Solution {
    public int solution(int[] numbers) {
        int sum = 45;
        for (int i : numbers) {
            sum -= i;
        }
        return sum;
    }
}

- 0부터 9까지의 숫자라고 정해져 있기 때문에 numbers배열에 숫자가 포함되어 있는지 없는지 상관없이 배열의 총합을 빼면 답이 나온는 거였다!!!!

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        int answer = -1;

        ArrayList<Integer> arr1 = new ArrayList<>();
        for(int i=0; i < 10; i++){
            arr1.add(i);
        }

        ArrayList<Integer> arr2 = new ArrayList<>();
        for(int i=0; i < numbers.length; i++){
            arr2.add(numbers[i]);
        }

        int sum = 0;
        for(int i=0; i < arr1.size(); i++){
            if(!arr2.contains(arr1.get(i))){
                sum += arr1.get(i);
            }
        }
        return sum;
    }
}

- 이분의 코드는 나와 같이 ArrayList를 사용하였는데 훨씬 가독성도 좋아보인다..

둘다 배열로 만들어 contains를 사용하여 같지 않은것을 더해줬다.

나는 intList.remove(Integer.valueOf(num));생각해내느라 40분은 걸린것 같은데ㅠㅠ

 

코드를 최대한 효율적으로 짜야된다는 것을 느꼈다.

또 기본 개념들이 정확하게 잡히지 않아서 코드를 짤때 어려움이 많은 것 같다.

처음부터 자바개념들을 다시 다져야겠다.

'TIL(Today I Learned)' 카테고리의 다른 글

TIL-230621  (0) 2023.06.22
TIL-230620  (0) 2023.06.20
TIL-230617  (0) 2023.06.17
TIL-230615  (0) 2023.06.16
TIL-230614(인텔리제이(IntelliJ)에서 작성한 코드 GitHub Repository에 올리기)  (0) 2023.06.15