Skip to main content

33. [Java] 왼쪽 오른쪽

https://school.programmers.co.kr/learn/courses/30/lessons/181890

  • 문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있다.
  • "l" 또는 "r" 중 먼저 나오는 문자열을 기준으로:
    • "l"이면 → 해당 인덱스 왼쪽 부분만 자르기
    • "r"이면 → 해당 인덱스 오른쪽 부분만 자르기
    • 둘 다 없으면 → 빈 리스트 [] 반환

  • 1 ≤ str_list의 길이 ≤ 20
  • str_list는 "u", "d", "l", "r" 네 개의 문자열로 이루어져 있다.

정답코드

import java.util.*;

class Solution {
    public List<String> solution(String[] str_list) {
        for (int i = 0; i < str_list.length; i++) {
            if (str_list[i].equals("l")) {
                // "l" 기준 왼쪽 부분 추출 (0 ~ i-1)
                return Arrays.asList(Arrays.copyOfRange(str_list, 0, i));
            } else if (str_list[i].equals("r")) {
                // "r" 기준 오른쪽 부분 추출 (i+1 ~ 끝)
                return Arrays.asList(Arrays.copyOfRange(str_list, i + 1, str_list.length));
            }
        }
        // "l"이나 "r"이 없다면
        return new ArrayList<>();
    }
}
  • subList(fromIndex, toIndex) : fromIndex부터 toIndex-1까지의 부분 리스트를 반환
  • equals() : 문자열 비교 시 반드시 사용해야 하며, ==는 객체 참조 비교
  • subList()원본 리스트의 뷰(view)이므로, 원본이 변경되면 함께 영향을 받을 수 있다.
  • 읽기 전용으로만 쓴다면 문제 없다.

asList() 를 사용한 코드가 오류나는 이유

import java.util.*;

class Solution {
    public List<String> solution(List<String> str_list) {
        for (int i = 0; i < str_list.size(); i++) {
            String s = str_list.get(i);
            if (s.equals("l")) {
                return str_list.subList(0, i);
            } else if (s.equals("r")) {
                return str_list.subList(i + 1, str_list.size());
            }
        }
        return new ArrayList<>();  // "l"이나 "r"이 없는 경우
    }
}
Arrays.asList(...)의 반환값이 고정 크기 리스트이기 때문에 Arrays.copyOfRange(...)String[]을 반환한다.
  • Arrays.asList(...)는 이 배열을 고정 크기 List<String>으로 래핑하므로 이 리스트는 추가나 제거가(add/remove) 불가능한 고정 크기 리스트이다.
  • 이 자체로는 에러는 안 나지만, 이 리스트를 나중에 add, remove 같은 메서드로 수정하려 할 경우 nsupportedOperationException이 발생한다.

리턴할 때 new ArrayList<>(...)로 감싸서 수정 가능한 리스트로 변환해서 해결했다.

return new ArrayList<>(Arrays.asList(Arrays.copyOfRange(str_list, 0, i)));