본문 바로가기
IT/Algorithm

프로그래머스(Programmers) 같은 숫자는 싫어(java)

by flatsun 2019. 8. 8.
반응형

프로그래머스 Level 1

같은 숫자는 싫어

자바(Java)

 

같은 숫자는 싫어 문제는 배열 arr를 받아서

첫 값과 그 다음 값이 다를 경우에는 새로 추가하지 않고

값이 다를 경우에만 추가하고 그 추가한 값으로 배열의 다음값과 비교해 추가하는 방식이다

 

포인트는 배열에는 처음 크기를 지정해 주고 넣어야 하는데

몇개가 나올지 모르는데 어떻게 처음 배열의 크기를 지정하냐는 것과

 

그 다음으로는 값을 비교해가면서 새 배열에 기존 arr 배열의 값을 담아야 하는데

어떻게 비교해서 담냐는 것이다

 

내 풀이방법은 다음과 같은데

 

먼저 처음 배열의 크기를 정확히 측정할 수 없는 만큼

arr의 배열의 길이만큼 int 형태의 배열을 생성한다

 

이후 for문을 돌려서

맨 처음의 경우에는 비교할 대상이 없으므로 무조건 삽입하고

이후에 j++를 통해 다음 값으로 보내준다

 

이제 맨 처음이 아닌 경우인데

이 경우에는 j-1로 이전 값을 가져와 신규 값과 비교한다

신규 값과 동일하다면 추가 없이 넘어가고

신규 값과 다르다면 j에 값을 넣어주고

j를 추가해 다음 값과 비교하게 한다

 

마지막으로 arrOri 배열 안에 값은 다 담았으나

배열 길이가 더 크기 때문에

필요한 값 외의 남은 배열의 칸은 죄다 0이 들어가 있는데

 

이제 Arrays.copyOf(복사할 배열명, 복사할 길이);

를 통해 추가한 배열만큼의 길이만 잘라준다

 

근데 추가한 배열의 길이는 어떻게 알까?

추가할 때 마다 j를 추가해주지 않았나!

 

j를 이용해서 잘라주면

필요한 만큼의 배열만 잘라내서 반환할 수 있다

 

마지막으로 프로그래머스 답안용으로는

아래 코드를 참조하면 된다

import java.util.*;

public class Solution {
	public int[] solution(int []arr) {
		int[] arrOri = new int[arr.length];
		
		int j  = 0;
		
		for(int i = 0; i<arr.length; i++) {
			if(i == 0) { // 처음의 경우
				arrOri[j] = arr[i];
				j++;
			} else { // 처음이 아닐 경우
				if(arrOri[j-1] != arr[i]) {
					arrOri[j] = arr[i];
					j++;
				} else {
					
				}
			}
		}
		int[] answer = Arrays.copyOf(arrOri, j);
        return answer;
	}
}
반응형

댓글