목차

풀이 방법
1. ArrayList의 remove() 메서드
ArrayList의 remove() 메서드를 이용하면 특정 index 또는 특정 값을 삭제할 수 있다고 해서 이 방법을 이용해서 풀었다.



import java.util.*;
class Solution {
public String[] solution(String[] strArr) {
String[] answer = {};
List<String> list = new ArrayList<String>(Arrays.asList(strArr));
answer = strArr;
for(int i=0; i<strArr.length; i++){
if(strArr[i].contains("ad")){
list.remove(strArr[i]);
answer = list.toArray(new String[0]);
}
}
return answer;
}
}
list.toArray(new String[0]); 은 빈 배열을 전달함으로써, List에 담긴 요소 수만큼 자동으로 배열 크기를 맞춰준다.
list.toArray(new String[0]); 인데도 배열의 길이가 0이 되지 않는 이유
이것은 Java의 List의 toArray(T[ ] a) 메서드의 동작원리 때문인데
- 만약 넘겨준 배열 a가 리스트 크기보다 크거나 같다면, 그 배열을 재사용해서 값을 채운 뒤 리턴함.
- 만약 넘겨준 배열 a가 리스트 크기보다 작다면, 리스트 크기에 맞는 새 배열을 내부적으로 생성하고, 그 새 배열을 채워서 리턴함.
위와 같은 이유로 그냥 String[ ] 타입이라는 걸 명시적으로 알려주는 역할을 한다.

list.toArray(new String[list.size()]);
와 같은 역할을 한다.
위의 코드처럼 쓸 수도 있지만 실질적인 성능 차이가 없고, 명확성과 코딩 관례 등의 사유로 new String[0] 방식을 주로 사용한다고 한다.
2. Stream 의 filter()
Stream의 filter()를 이용해서도 풀 수 있을 것 같다.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html
java.util.stream (Java SE 17 & JDK 17)
package java.util.stream Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections. For example: int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(
docs.oracle.com
Stream (Java SE 17 & JDK 17)
Type Parameters: T - the type of the stream elements All Superinterfaces: AutoCloseable, BaseStream > A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and
docs.oracle.com

import java.util.*;
class Solution {
public String[] solution(String[] strArr) {
return Arrays.stream(strArr).filter(str -> !str.contains("ad")).toArray(String[]::new);
}
}
이전에 toArray(new String[0]); 으로 맨 뒤에 썼다가 계속 오류가 발생했다.
찾아보니, Stream에서는 toArray() 를 쓰는 방식이 달랐다.

3. AI가 제시한 코드 방식
AI에게 내가 작성한 코드를 제시하였을 때 제공한 개선된 코드이다.
import java.util.*;
class Solution{
public String[] solution(String[] strArr){
List<String> list = new ArrayList<>();
for(String s : strArr){
if(!s.contains("ad")){
list.add(s);
}
}
return list.toArray(new String[0]);
}
}
- for 문 안에서 list.toArray(new String[0]); 을 호출하고 있어 성능에 좋지 않음.
- List.remove(strArr[i]) 는 순회와 수정을 동시에 하고 있기 때문에 안전하지 않고, 원하는대로 문제가 해결되지 않을 수 있음.
부분을 개선한 코드라고 한다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 홀수 vs 짝수 (JAVA/ 자바) (2) | 2025.08.02 |
|---|---|
| [프로그래머스] A 강조하기 (JAVA/ 자바) (5) | 2025.07.26 |
| [프로그래머스] 자동차 대여 기록에서 대여중/ 대여 가능 여부 구분하기 (MySQL) (2) | 2025.05.18 |
| [프로그래머스] 입양 시각 구하기(2) (MySQL) (1) | 2025.05.12 |
| [프로그래머스] 약수의 개수와 덧셈 (JAVA/ 자바) (1) | 2025.04.01 |