프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] ad 제거하기(Java)

Sigfriede 2023. 5. 11. 01:00

  문제 설명

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

 

  제한사항

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

 

  입출력 예

strArr result
["and", "notad", "abcd"] ["and", "abcd"]
["there", "are", "no", "a", "ds"] ["there", "are", "no", "a", "ds"]
import java.util.ArrayList;
class Solution {
    public String[] solution(String[] strArr) {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < strArr.length; i++) {
            if (!strArr[i].contains("ad")) {
                list.add(strArr[i]);
            }
        }
        String[] answer = new String[list.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}

  ArrayList를 생성합니다. for문이 strArr의 길이만큼 순회합니다. if문에서 만약 strArr의 i번째 원소가 "ad"를 포함하고 있지 않다면, list에 strArr의 i번째 원소를 추가합니다. 이는 간접적으로 "ad"를 포함하는 원소를 제거하는 것입니다.

  answer 배열을 생성하여 크기는 list의 크기로 지정합니다. for문이 answer의 길이만큼 순회하여 answer의 i번째 원소에 list의 i번째 원소를 할당합니다. 이는 단순히 리스트에 있는 원소를 배열로 옮기는 과정입니다.

  ArrayList에 strArr를 집어 넣어서 remove로 원소를 제거할 수 있지 않냐는 생각이 들 수 있습니다. 이는 틀린 생각이 아닙니다. 그러나 List의 원소를 제거하면 리스트의 크기가 변경되고 이에 따라 의도한 대로 for문이 작동하지 않을 수 있습니다. 값에 따라서 어떤 답은 맞고, 어떤 답은 틀릴 수도 있기 때문이죠. 따라서 추가적인 동작이 필요합니다. 예는 다음과 같습니다.

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

  if문이 동작하면 i를 감소시킴으로써 변경된 list의 크기에 맞추는 것입니다. 앞선 방법이 번거롭다면 아래와 같은 방법을 쓸 수도 있습니다.

import java.util.ArrayList;
import java.util.Arrays;
class Solution {
    public String[] solution(String[] strArr) {
        ArrayList<String> list = new ArrayList<>(Arrays.asList(strArr));
        list.removeIf(str -> str.contains("ad"));

        String[] answer = new String[list.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}

  removeIf를 이용하는 것입니다. 이는 인자에 삭제할 조건을 받아서 조건에 해당하는 원소를 삭제하는 메소드입니다. 조건에는 람다식을 이용했습니다. 이 람다식은 String형의 매개 변수를 받아서 해당 문자열이 "ad"를 포함하는지 확인합니다. 람다식은 코드를 간결하게 만들지만, 재활용이 어려우므로 제대로 사용하는 것이 중요합니다.