컴공댕이 공부일지

[java] 프로그래머스 (12906 같은 숫자는 싫어) 💥💦 본문

문제 풀이/코딩 문제 풀이 모음

[java] 프로그래머스 (12906 같은 숫자는 싫어) 💥💦

은솜솜솜 2023. 5. 4. 19:55
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

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

programmers.co.kr

 

 

첫 접근이 완전히 틀려먹어 쉬운 문제인데 애를 먹었다.

 

첫 번 째 접근,

{1,1,1,3,3,0,1}의 경우,

인덱스 0(i)과 1(i+j), 인덱스 0(i)과 2(i+j)는 중복되니 거르고,

그 다음 조사할 값은 0(i)+2(i+j)에 +1을 해준 3번 인덱스 값이다.

 

그리고 다시 또 j=1로 초기화 한 후,

인덱스 3(i)과 4(i+j)가 겹친다... 이런식이었다...

 

i j 등의 인덱스를 저장하는 변수 값들이 섞여 꼬이면서 더러운..ㅎ 코드가 되었다.

각 수가 몇 번 중복되는지 횟수를 카운팅하는 문제도 아니었는데

굳이 j를 써서 불필요하게 여러 인덱스를 저장해둬서, 풀면서 배열 범위 밖을 벗어나는 문제도 발생했다.

 

그래서 다른 분들의 풀이를 참고하며, 접근법을 바꿨다. 

 

 

 

두 번 째 접근,

달라지는 순간을 체크하기!

굳이 몇 개가 중복되는지 체크할 것도 아닌데, 앞에서부터 몇번째까지 중복되는걸 쭉 훑는 건 너무 손해다.

그냥 단순히 옆과 달라지면 달라졌구나!를 체크하면 된다.

 

아래 사진은 예제 arr={1,1,3,3,0,1,1} 로 내 풀이를 요약한 필기본이다.

 

풀이법 한 장 요약

이런식으로 배열의 값이 이전과 달라지는 순간에 집중하는 접근법이면 문제는 정말 간단해진다.

 

 

 

정답 코드

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        int k=0; //answer 배열의 인덱스 표시
        int count=0; //값이 달라지는 횟수 체크! 
        
        for(int i=0; i<arr.length-1; i++) {
	    	 if(arr[i]!=arr[i+1]) { 
	    		 count++;
	    	 }
	     }
	     
	     int [] answer = new int[count+1]; //2번 달라지면, 숫자 종류 총 3개!
	     
	     answer[0]=arr[0]; //비교를 위해 젤 처음 값은 그대로 대입
	     k++;
	     
	     for(int i=0; i<arr.length-1; i++) {
	    	 if(arr[i]!=arr[i+1]) { //값이 달라지는 순간 체크!
	    		 answer[k]=arr[i+1];
	    		 k++;
	    	 }
	     }
        

        return answer;
    }
}

 

 

간단한 문제인데 한참 시간을 잡아먹었다...ㅎ

문제가 안풀릴땐 틀린 접근은 과감히 접어두고, 코드를 뒤엎고 새롭게 접근해보자 :)..

728x90
Comments