Hayden's Archive

[알고리즘] 프로그래머스 : 같은 숫자는 싫어 본문

Algorithm

[알고리즘] 프로그래머스 : 같은 숫자는 싫어

_hayden 2020. 5. 13. 21:25

알고리즘 문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


내가 작성한 코드

방법이 생각나지 않아서 일단 ArrayList에 담은 후 담은 값을 int[] 배열에 다시 담는 코드를 짰다.

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
		ArrayList<Integer> anList = new ArrayList<>();
		anList.add(arr[0]);
		for(int i = 0; i < arr.length-1; i++) {
			if(arr[i+1] != arr[i]) {
				anList.add(arr[i+1]);
			}
			else continue;
		}
		int[] answer = new int[anList.size()];
		for(int i = 0; i < answer.length; i++) {
			answer[i] = (int) anList.toArray()[i];
		}
        return answer;
    }
}

 

하지만 역시 효율성에서 탈락. 배열의 크기가 100만개라는 데서 예견될 결과이긴 했다.

 

계속 고민하다가 그냥 파이썬으로 풀었다. 자바에서는 배열을 쓰려면 길이부터 고정적으로 정해주고 들어가야 하고 이미 만들어진 배열에서 추가와 삭제가 어려운 반면 파이썬은 리스트 추가가 간편하기 때문이다. (그래서 보통 자바에서 배열을 잘 안 쓰고 ArrayList를 쓰게 됨)

def solution(arr):
    answer = []
    answer.append(arr[0])
    for i in range(0, len(arr)-1):
        if arr[i+1] != arr[i]:
            answer.append(arr[i+1])
    return answer

 

오기가 생겨서 자바로 다시 풀었는데 마지막 부분 코드 한줄만 수정했더니 통과했다. 생각해보니까 ArrayList에서 get() 메소드를 써서 값을 가져와서 그냥 저장하면 되는데 ArraysList를 toArray로 Integer 타입 배열로 바꾸고 인덱스 넣어서 값 불러온 다음에 그걸 또 int형으로 캐스팅하고 그러니 시간 복잡도가 높아질 수밖에. 간단한 거였는데 너무 어렵게 생각했다.

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
		ArrayList<Integer> anList = new ArrayList<>();
		anList.add(arr[0]);
		for(int i = 0; i < arr.length-1; i++) {
			if(arr[i+1] != arr[i]) {
				anList.add(arr[i+1]);
			}
			else continue;
		}
		int[] answer = new int[anList.size()];
		for(int i = 0; i < answer.length; i++) {
			answer[i] = anList.get(i);
		}
        return answer;
    }
}

 

다른 좋은 방법은 없는지 좀 더 고민해봐야겠다.

 

관련 : int와 Integer의 차이점 https://blog.naver.com/0neslife/221017557396