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)));