컴공댕이 공부일지
[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;
}
}
간단한 문제인데 한참 시간을 잡아먹었다...ㅎ
문제가 안풀릴땐 틀린 접근은 과감히 접어두고, 코드를 뒤엎고 새롭게 접근해보자 :)..
'문제 풀이 > 코딩 문제 풀이 모음' 카테고리의 다른 글
[ java ] 백준 ( 2231 분해합 ) (0) | 2023.05.11 |
---|---|
[ java ] 프로그래머스 ( 42748 K번째 수 ) ⭐배열의 복사 / 정렬 [copyArray, copyOf, copyOfRange 총 정리] (0) | 2023.05.09 |
[ java ] 백준 ( 11050 이항계수 1 ) ★팩토리얼 재귀함수 / 이항정리 (0) | 2023.05.02 |
[java] 백준 ( 2292 벌집 ) (0) | 2023.04.28 |
[java] 백준 ( 2869 달팽이는 올라가고 싶다 ) (0) | 2023.04.18 |