[프로그래머스/Java] Lv.0 ad 제거하기

febCho·2024년 3월 14일
0

코딩테스트

목록 보기
83/253
post-thumbnail

문제

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

- 제한사항

  • 1 ≤ strArr의 길이 ≤ 1,000
  • 1 ≤ strArr의 원소의 길이 ≤ 20
  • strArr의 원소는 알파벳 소문자로 이루어진 문자열입니다.

풀이

"ad"를 포함하는 부분 문자열이 있는 인덱스를 제외하고 배열을 복사하는 형태로 문자열 요소들을 제거하면, 원본 배열에 그 상황을 반영해 주어야 하는데 그게 더 복잡하다고 생각했던 것 같다. 풀이 과정을 쓰려고 하니 그게 더 간단했을 수도 있다 싶은..

remove()를 사용하기 위해 주어진 문자열 배열 String[] strArr을 List 객체로 변환하는 과정에서 아래와 같은 에러를 만나기도 했다.

Exception in thread "main" java.lang.UnsupportedOperationException

구글링을 해보니 List<String> strList = Arrays.asList(strArr);라고 사용한 게 문제였다. 값을 세팅 후 변경하지 않을 거라면 List형을 Arrays.asList()로 초기화 해도 문제가 없지만 new 생성자를 사용해 생성하지 않은 List의 값을 변경할 시에는 위와 같은 에러가 발생한다고 한다.

그래서 생성자를 사용해 초기화를 해준 다음, List 객체의 요소가 주어진 문자열인 "ad"를 포함한다면, 해당 요소를 제거해 주고 요소 제거로 인해 인덱스 변동이 생긴 것을 반영하기 위해 i--; 해주었다.
ex. 5번 요소 제거 → 6번 요소가 5번 요소로 인덱스 이동 → i--; 해주지 않는다면, 6번 요소가 된 7번 요소부터 다시 체크하게 됨

그리고 매번 for문을 이용해 List 객체의 값을 배열에 복사해 주곤 했는데, 그 방법이 비효율적인 것 같아서 또 한 번 구글링을 했다. 그러다 발견한 strList.toArray()!!

toArray()

java.util.List 패키지에 속한 메서드로,

파라미터로 전달받은 배열 객체의 길이가 원본 리스트보다 작을 경우
→ 자동으로 원본 리스트의 size 크기 만큼 배열을 만들어 준다.
반면, 원본 List의 길이보다 배열의 크기를 더 크게 지정할 경우
→ 배열의 나머지 인덱스는 null로 채워준다고 한다.

메모리 낭비가 싫어서 List 객체의 크기에 딱 맞게 배열을 생성한 후 toArray()로 변환해 주었지만, 저런 이점이 있다는 것. 루프 돌릴 걸 한 줄로 해결이 되니 앞으로 자주 써봐야겠다.

import java.util.*;

class Solution {
    public String[] solution(String[] strArr) {
        List<String> strList = new ArrayList<>(Arrays.asList(strArr));
        
        for(int i=0;i<strList.size();i++){
            if(strList.get(i).contains("ad")){
                strList.remove(i);
                i--;
            }
        }
        
        String[] answer = strList.toArray(new String[strList.size()]);
        return answer;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글