본문 바로가기
Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 문자리스트를문자열로반환하기 // join String

by 외계나무 2024. 1. 8.

프로그래머스 - level 0 문자 리스트를 문자열로 반환하기

일단은 단순하게 풀었다.

class Solution {
    public String solution(String[] arr) {
        String answer = "";
        for(int i=0; i<arr.length; i++) {
            answer+=arr[i];
        }
        return answer;
    }
}

원래 쓰고 싶었던 방식. arr.stream()으로 해서 안됐다. Arrays와 stream()에 대한 이해가 부족하긴 한 듯.

import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
    public String solution(String[] arr) {
        return Arrays.stream(arr).collect(Collectors.joining());
    }
}

이것도 있더라.... String.join()

class Solution {
    public String solution(String[] arr) {
        return String.join("", arr);
    }
}

 

chatGPT에게 세 코드를 비교해달라고 했다.

  • 가독성:
    • 첫 번째 방식은 명시적인 루프를 사용하므로 좀 더 직관적이지만 코드가 길어질 수 있습니다.
    • 두 번째와 세 번째 방식은 라이브러리 메서드를 사용하므로 더 간결하고 읽기 쉬울 수 있습니다.
  • 효율성:
    • 두 번째와 세 번째 방식은 내부적으로 최적화되어 있어 더 효율적일 수 있습니다. 특히, 세 번째 방식은 스트림을 이용하므로 병렬 처리도 간단하게 적용할 수 있습니다.
  • 유연성:
    • 두 번째와 세 번째 방식은 구현이 라이브러리에 의존하므로 더 추상화되어 있고, 이는 유지보수 및 확장성에 도움이 될 수 있습니다.

모든 방식은 주어진 문제를 해결하는 데 유효하며, 선택은 코드의 선호도와 상황에 따라 달라질 수 있습니다. Java 8 이상의 버전을 사용한다면 두 번째나 세 번째 방식을 선호하는 것이 좋습니다.

시간복잡도 평가

  1. For Loop 사용:
    • for 루프를 사용하여 배열의 모든 요소를 순회하므로 O(n)입니다. (n은 배열의 길이)
  2. String.join 메서드 사용:
    • String.join 메서드는 내부적으로 StringBuilder를 사용하며, 각 문자열을 복사하는 비용은 O(n)입니다. 전체적으로는 O(n)입니다.
  3. Stream 및 Collectors.joining 사용:
    • Arrays.stream(arr)은 O(n) 시간이 소요됩니다.
    • Collectors.joining()은 내부적으로 StringBuilder를 사용하며, 각 문자열을 복사하는 비용은 O(n)입니다. 전체적으로는 O(n)입니다.

따라서 이러한 방법들은 모두 선형 시간 복잡도를 갖고 있습니다.