Q. 문제
배열 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보다 작거나 같은 정수
풀이 방법 1> ArrayList를 이용하여 중복 원소 제거
import java.util.ArrayList;
import java.util.List;
public class Problem7 {
static int[] solution(int[] arr){
List<Integer> list = new ArrayList<>();
for(int i : arr)
list.add(i);
for(int i = 0; i < list.size()-1; i++){
if(list.get(i) == list.get(i+1)){
list.remove(i+1);
i--; //배열요소 한개 작아져서 i도 감소시켜야 함
}
}
int[] answer = new int[list.size()];
for(int i = 0; i < answer.length; i++) //list.size로 했더니
answer[i] = list.get(i);
System.out.println("Hello Java");
return answer;
}
public static void main(String[] args) {
//테스트 코드입니다.
int[] arr1 = {1,1,3,3,0,1,1};
System.out.println();
for(int i : solution(arr1))
System.out.print(i + " ");
int[] arr2 = {4,4,4,3,3};
for(int i : solution(arr2))
System.out.print(i + " ");
}
}
ArrayList로 원소 삭제 시에 for문의 i 변수를 조심해야 한다. i의 값을 그대로 가져가면, 원하는 결과가 나오지 않을 수 있다. (테스트 케이스에 따라 달라질 것이다..)
하지만 결과는
정확도는 100%가 나왔지만, 효율성이 0% 가 나왔다..
효율성에서 늘 약한 모습을 보였는데... 역시나는 역시 '나'였다.
for문을 많이 사용한것이 효율성에 영향을 미쳤다고 생각했다.
풀이가 떠오르지 않아 구글링을 하였다. (참조 : https://jhnyang.tistory.com/131 )
[프로그래머스 LEVEL 1] 같은 숫자는 싫어 문제 해설 및 오답 풀이, 연속된 수 제거
백준이 아무래도 기초부터 풀기에는 쉬운 문제가 많아서 백준 문제부터 해설하려고 했는데.. 단점이 너무 질려 ㅠㅠㅠㅠㅠ 고러므로 오늘은 프로그래머스의 문제를 풀이하겠습니다.ㅎㅎ [Level 1] 같은 숫자는 싫..
jhnyang.tistory.com
풀이 방법이 3가지를 제시하였다.
1) ArrayList에 주어진 배열의 값을 저장하면서 동시에 중복 내용을 검토
2) 먼저 중복된 개수를 파악하여 return 될 배열의 크기를 파악한 뒤에 그 배열에 중복되지 않은 원소들을 저장하는 방법
3) StringBuilder 이용한 (신박한) 풀이
1), 2) 의 경우 쉽게 접근할 수 있을 것이라 생각하여 3) 번 풀이의 내용을 가져왔다.
public class Solution {
static int[] solution(int[] arr) {
StringBuilder sb = new StringBuilder();
int size = arr.length;
sb.append(arr[0]);
for(int i = 1; i < size; i++){
if(arr[i-1] != arr[i]) sb.append(arr[i]);
}
String[] array = sb.toString().split("");
size = array.length;
int[] answer = new int[size];
for(int i = 0; i < size; i++){
answer[i] = Integer.parseInt(array[i]);
}
return answer;
}
}
나의 풀이와 비교했을 때 for문 사용 횟수도 줄고, ArrayList도 사용하지 않았다. (배열의 크기 변화 x)
이전에 String, StringBuffer, StringBuilder 이 3가지의 차이에 대해서 공부했었는데, 오래전에 공부한 것이라 잘 기억이 안 나서
문자열을 수정할 때 String으로 수정하면 더 많은 메모리를 사용하게 된다는 내용이었던 거 같다.
다음 포스팅 때에는 String, StringBuilder, StringBuffer의 차이점에 대해서 공부하기로 여기서 다짐해본다.
'코딩 테스트' 카테고리의 다른 글
프로그래머스 코딩 테스트 연습문제: 타겟 넘버 (DFS/BFS) (2) | 2019.10.19 |
---|---|
프로그래머스 코딩테스트 연습: 문자열 내 마음대로 정렬하기 (0) | 2019.09.01 |
프로그래머스 코딩테스트 연습: 나누어 떨어지는 숫자 배열 (0) | 2019.08.30 |
프로그래머스 코딩테스트 연습: 가운데 글자 가져오기 (0) | 2019.08.28 |
프로그래머스 코딩테스트 연습 : 2016년 (0) | 2019.08.27 |