| English | 의미 |
|---|---|
| shift/ʃɪft/ | 시프트 |
| delete/dɪˈliːt/ | 삭제 |
| insert/ˈɪnsɜːt/ | 삽입 |
인접한 삭제는 생략된 요소를 드러냅니다
[0, 0, 5]로 시작하여 인덱스 0을 제거한 후 i를 증가시킵니다. 두 번째 0이 인덱스 0로 이동했으므로, 전진 루프는 이를 건너뛰고[0, 5]을 남깁니다.- For the forward while-loop taught here, stay at the same index after removal and advance only when keeping an element. It then removes both zeros and finishes with
[5].
제거 후 현재 전방 인덱스를 유지하세요
remove(i)이후, 모든 나중 요소가 한 자리씩 왼쪽으로 밀립니다. 이제 i에 있는 요소는 아직 검사되지 않았으므로, 다음 반복에서 확인하십시오.- 아래 루프는 비공/null이 아닌 Integers의 List를 받아서 각 0을 제자리에 in-place으로 제거합니다. 매 반복마다 현재 크기를 사용하며, 빈 List에 대해 get 호출을 수행하지 않습니다.
import java.util.ArrayList;
public class RemoveZeros {
public static void removeZeros(ArrayList<Integer> list) {
int i = 0;
while (i < list.size()) {
if (list.get(i) == 0) {
list.remove(i);
} else {
i++;
}
}
}
}
이 루프가 종료되는 이유를 설명하세요
- 각 반복은either 하나를 제거하고 크기를 줄이거나, 하나를 유지하고 i를 증가시킵니다. 따라서
size() - i, 즉 아직 체크해야 할 위치의 개수는 반복마다 하나씩 감소합니다. [0, 0, 5]로 시작하여, 상태는 i=0일 때[0, 5], i=0일 때[5], 그리고 i=1일 때[5]입니다. 마지막 조건이 거짓이므로, 인덱스 범위를 벗어난 접근은 발생하지 않습니다.
후방 루프는 다른 규칙을 따릅니다
- 역순(later loop) 루프는 마지막 유효 인덱스로 시작합니다:
for (int i = list.size() - 1; i >= 0; i--). 일치하는 요소를remove(i)로 제거하면, 다음 i는 항상 하나 더 낮아집니다. - i에서 삭제하면 이미 검증한 나중 인덱스들만 밀립니다. 아직 확인하지 못한 앞쪽 요소들은 인덱스를 유지하므로, 제거 후 감쇠(decrementing)는此处正确; “제거 후 절대 진행하지 마라”는 보편적 규칙이 아닙니다.
traverse 방향과 일치하는 인덱스 업데이트를 선택하십시오. 전방 while-looopy에서는 제거 후 머물고, 후방 for-loop에서는 감쇠를 계속합니다. enhanced loop 중 직접적인 구조 변경은 실패-빠른(fail-fast) 예외가 표시되지 않더라도 별도의 위험한 패턴입니다.
여기서 보여주는 전진 while-루프에서는 다음 조건일 때만 i를 증가시키십시오...
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
remove(i) 후 다음 요소가 인덱스 i로 밀려 들어오므로, 이를 건너뛰지 마십시오.
[0, 0, 5]에서의 단순 전진 루프는 i=0에서 삭제를 수행한 후 i를 증가시켜 다음 0을 건너뜁니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
남은 0이 인덱스 0으로 이동하지만, 다음 테스트는 인덱스 1에서 이루어집니다. 후진 루프는 다른 올바른 인덱스 규칙을 사용합니다.
밀림(shifting)을 피하는 대안 재배치는 ...입니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
새로운 리스트에 유지할 요소를 추가하면 밀림을 회피할 수 있습니다.
ArrayList 알고리즘은 ...을 통해 배열 패턴을 재사용합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
배열 []과 length를 get(i)과 size()로 교체하십시오.
Resizable한特性로 인해 ArrayList은 고정 배열과 달리 요소를 삽입하고 삭제할 수 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
add와 remove는 리스트의 크기를 변경합니다.
size()-1에서 시작하는 후진 삭제 루프는 매 삭제 후 동일한 인덱스에 머물러야 합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
거짓: 이전에 검증되지 않은 항목은 인덱스를 유지하므로 후진 루프는 정상적으로 감소합니다.
원본이 유지되어야 할 때 새 목록을 만드세요
- To preserve the original list, create a fresh result and append every nonzero element while reading the original. This keeps the original sequence and its size unchanged; it uses additional list storage.
- mutable 객체의 List의 경우, 유지된 참조를 복사해도 해당 객체 자체는 clone되지 않습니다. 새 List 구조는 여전히 원본과 동일한 element object를 공유할 수 있으므로, list identity와 element identity를 구분해야 합니다.
전진 삭제 시 삭제 후 다음 인덱스가 유지됩니다.
인덱스 0에서 두 인접한 영수가 검사된 후, 5이 유지됩니다.
알고리즘을 노출하는 case를 확인하세요
- Test an empty list, all zeros, no zeros, adjacent zeros and a zero at the last index. For in-place removal, other references to the same list observe its change; a fresh result leaves that original structure intact.
- ArrayList은 요소를 insert하거나 delete할 수 있으며, 이러한 연산은 나중 인덱스를 shift할 수 있습니다. search는 찾은 인덱스 또는 부재 시 -1을 반환할 수 있으며, maximum는 명시적인 빈列表 policy가 필요합니다. get/size를 통한 배열 패턴 재사용은 도움이 되지만, 각 알고리즘은Still独自の bounds와 contract가 필요합니다.
제거는 인덱스를 shift시킵니다. 어떤 요소가 아직檢查되지 않았는지 설명하고 그에 따라 다음 인덱스를 선택하십시오. 전방 stay-or-increment와 후방 decrement는 모두 유효한 패턴이며, 유지된 요소들의 새 List는 원본 구조를 보존하지만 객체를 공유할 수 있습니다.
Order the states for the corrected removal loop on [0, 0, 5].
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
Each removal rechecks the shifted value; keeping 5 finally advances the index.
보여진 전진 removeZeros 메서드가 빈 목록에서 몇 번의 get 호출을 수행합니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
초기 조건 0 < 0이 거짓이므로 get 호출이 발생하지 않습니다.