[ 코테 ] 같은 숫자는 싫어

최수정·2022년 11월 10일
0

알고리즘(자바)

목록 보기
4/12

프로그래머스 문제

List 사용

핵심로직

  • SET - 모든 중복이 사라짐, 순서보장 x
  • '바로' 앞(i-1)에 있는 숫자와 다르면 넣는다.
 List<Integer> answerList = new ArrayList<>();
 answerList.add(arr[0]);
 // 리스트의 마지막 번째와 arr[i]를 비교해서 같지 않으면 list.add()
 // 그 다음 list를 array로 

오류 사항

🔽 오류코드

public static void main(String[] args) {
        int [] arr = {1,1,3,3,0,1,1};
        List<Integer> answerList = new ArrayList<>();
        
        for (int i = 0; i < arr.length-1; i++) {
            if (arr[i] != arr[i+1]) {
                answerList.add(arr[i]);
            }
        }
        System.out.println(answerList);
    }
결과 : [1,3,0]
예상 : [1,3,0,1]

오류 수정 생각 흐름

  • for문 안의 if문에서 arr안의 값을 서로 비교할 때, i가 arr의 맨 끝 수에 접근하지 않아 arr[5]에서 다음 값인 arr[6]이 같으니까 list에 넣지 않았고, for문의 종료조건이 i < arr.length-1; 이였기 때문에 arr[6]은 비교할 다음 값이 존재 하지 않았다.
  • nullposition이 뜨지 않게 if문을 어떻게 수정 할 수 있을까.
  • 우선 입력된 배열의 맨 처음 값을 list에 넣어놓고 시작, i를 1부터 시작해서 그 전의 수와 비교하게 하면 i가 배열의 끝 수 까지 훑을 수 있다.
  • (+가독성) 코드를 짤때, 개발자는 본인이 이해하는 로직으로 코드를 짠다. 하지만 다른 사람이 코드를 읽는것도 고려해서 짜야한다.
    if (arr[i] != arr[i+1]) -> if (answerList.get(answerList.size() - 1) != arr[i])

🔽 수정코드

 public static void main(String[] args) {
        int [] arr = {1,1,3,3,0,1,1};
        List<Integer> answerList = new ArrayList<>();
        answerList.add(arr[0]);
        for (int i = 1; i < arr.length; i++) {
             if (answerList.get(answerList.size() - 1) != arr[i]) {
                answerList.add(arr[i]);
            }
        }
        System.out.println(answerList);
    }

🔽 제출에 맞게 수정된 코드

    public int[] solution(int []arr) {
        List<Integer> answerList = new ArrayList<>();
        answerList.add(arr[0]);

        for (int i = 1; i < arr.length; i++) {
            if (answerList.get(answerList.size() - 1) != arr[i]) {
                answerList.add(arr[i]);
            }
        }
        int [] answer = new int [answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        return answer;
    }
    public static void main(String[] args) {
    			...
    }
 }

Stack 사용

  • 장점
    .peek() <> answerList.get(answerList.size() - 1)
    list.add()보다 cost가 적다.

  • 단점
    거꾸로 꺼내야 하는 것

 public int[] solution(int[] arr) {
        // 1. 스택 만들어서 중복 제거 하여 스택에 넣기
        Stack<Integer> stack = new Stack<>();
        stack.push(arr[0]);
        for (int i = 1; i < arr.length; i++) {

            if (stack.peek() != arr[i]) {
                stack.push(arr[i]);
            }
        }
        // 2. 스택 pop()이용해 배열로 옮겨주기 (꺼꾸로 꺼내야 함에 주의)
        int[] answer = new int[stack.size()];

        for (int i = stack.size()-1; i >= 0; i--) {
            answer[i] = stack.pop();
        }
        return answer;
}

0개의 댓글