본문 바로가기
알고리즘/프로그래머스

[프로그래머스] ad 제거하기 (JAVA/ 자바)

by pandastic 2025. 7. 24.
반응형

 

목차

     

     

    풀이 방법

    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) 메서드의 동작원리 때문인데

    1. 만약 넘겨준 배열 a가 리스트 크기보다 크거나 같다면, 그 배열을 재사용해서 값을 채운 뒤 리턴함.
    2. 만약 넘겨준 배열 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

     

    https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html#filter(java.util.function.Predicate)

     

    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]);
        }
    }
    1. for 문 안에서 list.toArray(new String[0]); 을 호출하고 있어 성능에 좋지 않음.
    2. List.remove(strArr[i]) 는 순회와 수정을 동시에 하고 있기 때문에 안전하지 않고, 원하는대로 문제가 해결되지 않을 수 있음.

    부분을 개선한 코드라고 한다.

     

    반응형