53. [Java] 빈 배열에 추가, 삭제하기
https://school.programmers.co.kr/learn/courses/30/lessons/181860
- 빈 배열
X
가 있음 (처음엔 아무 원소도 없음) - 길이가 같은 두 배열
arr
(정수 배열),flag
(불린 배열)이 주어짐 flag
를 순서대로 돌면서:flag[i]
가 true면 →arr[i]
값을arr[i] × 2
번 배열X
뒤에 추가flag[i]
가 false면 → 배열X
의 마지막arr[i]
개 원소를 제거
- 최종적으로 배열
X
를 return
- 1 ≤ arr의 길이 = flag의 길이 ≤ 100
- arr의 모든 원소는 1 이상 9 이하의 정수이다.
- 현재 X의 길이보다 더 많은 원소를 빼는 입력은 주어지지 않는다.
정답코드
import java.util.*;
class Solution {
public int[] solution(int[] arr, boolean[] flag) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < flag.length; i++) {
if (flag[i]) { // 조건문에서 바로 boolean 값 사용
// arr[i] * 2번 추가
for (int j = 0; j < arr[i] * 2; j++) {
list.add(arr[i]);
}
} else {
// 리스트 끝에서 arr[i]개 원소 제거
for (int j = 0; j < arr[i]; j++) {
list.remove(list.size() - 1);
}
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
- 빈 리스트
list
생성
→ 최종 결과 배열을 만들기 위한 동적 리스트 flag
배열을 순회하면서flag[i]
가true
면
→arr[i] * 2
번arr[i]
값을list
에 추가flag[i]
가false
면
→list
에서 마지막부터arr[i]
개만큼 원소 제거
- 최종적으로
list
를int[]
배열로 바꿔서 return
오답
import java.util.*;
class Solution {
public int[] solution(int[] arr, boolean[] flag) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < flag.length; i++) {
if (flag[i] = true) { // ❌
list.add(arr[i]); // ❌
list.add(arr[i]); // ❌
} else {
for (int j = 0; j < arr[i]; j++) {
list.remove(list.size() - 1);
}
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
1) 조건문에서 대입(=) 사용
if (flag[i] = true) { // ❌
여기서 =는 대입 연산자라서, 항상 true가 된다. 조건 비교는 조건문에서 바로 boolean값을 써야 한다.
if (flag[i]) // ✔️
2) arr[i] × 2번 추가가 아니라 2번만 추가하고 있음
list.add(arr[i]); // ❌
list.add(arr[i]); // ❌
이건 무조건 두 번만 넣는 코드이다. 문제는 arr[i] 값을 arr[i] * 2번 넣어야 한다. 아래와 같이 수정했다.
// arr[i] * 2번 추가 ✔️
for (int j = 0; j < arr[i] * 2; j++) {
list.add(arr[i]);
}