문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
제한사항
배열 arr의 크기 : 1,000,000 이하의 자연수
배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
시작 전 문제 파악 및 전략 수립
내 생각엔
배열을 for문 돌면서
하나 하나씩 순서대로 임시로 변수에 해당 값을 저장하고
다음 값과 비교하고
같으면 파기 아니면 다른 값을 저장하고
새로운 배열에 다시 값들을 저장하면 될듯 하다
사용자료구조
LinkedList
문제를 몇 번의 시행 착오를 통해서
for 문으로 linkedList를 거쳐서 linkedList를 다시 최종 결과 배열 answer로 변환해서 하는 것은 성공했으나 최적화 관련 테스트에서 통과하지 못해서
자료 구조 등 다른 방법을 생각해야 했다
LinkedList 자료구조 사용으로 느려서 생긴 문제로 보고
배열로 바꾸고 for문은 그대로 사용하기로 했다
내가 구상한 로직상 ArrayList를 조금 쓸 수 밖에 없었는데 다행히
간단한 for문이라 속도가 많이 느리진 않았나 보다
아래는 최종 통과한 코드이다.
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
int[] answer = new int[arr.length];
Arrays.fill(answer, -1);
answer[0] = arr[0];
int count = 0;
for(int i = 0; i < arr.length-1; i++){
int preNum = arr[i];
int postNum = arr[i+1];
if(preNum != postNum) {count++;
answer[count] = postNum;
}
}
ArrayList<Integer> filteredList = new ArrayList<>();
// -1이 아닌 값을 가진 요소들을 새로운 ArrayList에 추가
for (int num : answer) {
if (num != -1) {
filteredList.add(num);
}
}
// 새로운 배열에 복사
int[] newArray = new int[filteredList.size()];
for (int i = 0; i < filteredList.size(); i++) {
newArray[i] = filteredList.get(i);
}
return newArray;
}
}'[코딩테스트]' 카테고리의 다른 글
| [프로그래머스] 약수의 합 - java (0) | 2024.04.06 |
|---|---|
| [프로그래머스] 옹알이(1) -자바 (0) | 2024.04.06 |
| [프로그래머스] 합성수 찾기 - 자바 (1) | 2024.04.05 |
| [프로그래머스] 옹알이(2) - Java (0) | 2024.04.04 |
| [프로그래머스] 외계어 사전 - Java (0) | 2024.04.04 |