[java] 프로그래머스 (12906 같은 숫자는 싫어) 💥💦
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;
}
}
간단한 문제인데 한참 시간을 잡아먹었다...ㅎ
문제가 안풀릴땐 틀린 접근은 과감히 접어두고, 코드를 뒤엎고 새롭게 접근해보자 :)..