4-3 같은 숫자는 싫어

유태형·2022년 5월 11일
0

알고리즘 - Java

목록 보기
9/32

출처

해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.




문제

문제 분석

배열에서 연속되는 숫자들을 제거하여 하나만 나오도록 하는 문제입니다. 다른 숫자로 바뀌었다가 또 다시 등장할 수도 있습니다.




풀이

연속되는 숫자들은 제거하지만 answer로 나오는 배열에는 다른 숫자로 바뀌기만 하면 다시 나올 수 있습니다. 따라서 Set을 그대로 사용하기 보단 Set의 작동 방식을 응용하여 구현하는것이 중요합니다.



나의 풀이

import java.util.*;

public class 같은숫자는싫어 {
    public static int[] solution(int []arr) {
        List<Integer> list = new ArrayList<>();
        Set<Integer> set = new HashSet<>();

        //첫 숫자는 구함
        int prev = arr[0];
        set.add(prev);

        for(int i=1;i<arr.length;i++){
            int now = arr[i];
            if(prev == now) set.add(now); //배열에서 같은 값이 나올때 까지 Set으로
            else{ //다른 값이 나오면 이전 값은 리스트로, Set에서 삭제, 새로운 값은 Set
                list.add(prev);
                set.remove(prev);
                set.add(now);
            }
            prev = now;
        }
        //배열 다 돌면 마지막 Set은 리스트로
        Iterator<Integer> iter = set.iterator();
        list.add(iter.next());
        //배열 반환
        return list.stream().mapToInt(i->i).toArray();
    }

    public static void main(String[] args) {
        int[] input1 = {1,1,3,3,0,1,1};
        System.out.println(Arrays.toString(input1));
        System.out.println(Arrays.toString(solution(input1)));

        int[] input2 = {4,4,4,3,3};
        System.out.println(Arrays.toString(input2));
        System.out.println(Arrays.toString(solution(input2)));
    }
}

굳이 Set을 넣어서 풀었었습니다. 연속되는 숫자인지 구하는 곳에서 Set을 통하여 중복을 없앴고, List를 만들어 결과를 반환하는 배열을 만들었습니다.

이전값과 현재값을 비교하여 연속된는 수인지 아닌지를 판단합니다.

arr : 무작위의 수 -> Set : 연속되는 숫자 제거 -> list 숫자 하나만 삽입 2단계에 걸쳐 연속 숫자를 하나로 줄였습니다.

또 List<>컬랙션을 배열로 바꾸기 위해 리스트.stream().mapToInt(i->i).toArray();로 Integer를 int로 형변환 시켰습니다.



강의의 풀이

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        List<Integer> list = new LinkedList<>();
        int last = -1;
        
        for(int a : arr){
            if(last == a) continue;
            last = a;
            list.add(a);
        }
        
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

Set을 쓰지 않고 Set의 기능을 응용하여 구현한 것입니다. 중복이면 넘기고 중복이 아닐때만 추가합니다.

이전값과 현재값을 비교하여 연속된는 수인지 아닌지를 판단합니다.

List<>컬랙션을 배열로 바꾸기 위해 리스트.stream().mapToInt(Integer::intValue).toArray();로 Integer를 int로 형변환 시켰습니다.




GitHub

https://github.com/ds02168/Study_Algorithm/blob/master/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/%5BJava%5D%20%EC%96%B4%EC%84%9C%EC%99%80%20%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%80%20%EC%B2%98%EC%9D%8C%EC%9D%B4%EC%A7%80/%ED%8C%8C%ED%8A%B84.Set(%EC%A7%91%ED%95%A9)/%EA%B0%99%EC%9D%80%EC%88%AB%EC%9E%90%EB%8A%94%EC%8B%AB%EC%96%B4.java

profile
오늘도 내일도 화이팅!

0개의 댓글