해결된 질문
작성
·
186
1
List<String> removeFruit(List<String> fruits, String target) {
// 여기에 작성해 주세요.
for(int i=0; i<fruits.length; i++){
if(target == fruits[i]) fruits.remove(fruits[i]);
}
return fruits;
}
상기 처럼 새로운 변수를 선언하지 않고 target 변수와 일치하는 멤버를 삭제하고 다시 fruits를 돌려주는 방식으로 생각을 해봤습니다.
그런데 아래 테스트 코드의 사과 2번으로 이어진 부분에서 사과 멤버 1개가 삭제되지 않고 출력되어 오류가 발생되더라구요.
assert(eq(removeFruit(["바나나", "사과", "딸기", "사과", "사과", "딸기"], "사과"), ["바나나", "딸기", "딸기"]));
어떤 논리적인 문제인 것 같은데 원인 찾는데 어려움이 있어 문의를 드립니다.
감사합니다.
답변 1
1
안녕하세요.
질문 답변드립니다!
fruits에는 ["바나나", "사과", "딸기", "사과", "사과", "딸기"] 총 6개의 과일이 들어있으며, 위에 올려주신 코드는 다음과 같이 실행됩니다.
i=0) 바나나가 반환되므로 넘어갑니다.
i=1) 첫 번째 사과가 삭제되고, fruits=["바나나", "딸기", "사과", "사과", "딸기"]로 전체 개수가 5개로 줄어듭니다.
i=2) 두 번째 사과가 삭제되고, fruits=["바나나", "딸기", "사과", "딸기"]로 전체 개수가 4개로 줄어듭니다.
i=3) i=2일 때 fruits의 배열이 크기가 줄어들면서 마지막 사과의 index가 2로 변경므로, 사과가 아닌 딸기가 나반환되므로 넘어갑니다.
i=1, 2일 때 사과를 2개 삭제했기 때문에, 전체 fruits의 개수가 4개로 줄어들어 반복문 실행 조건인 i<fruits.length에 의해 i=3까지만 실행됩니다.
위와 같은 과정에 의해 따라서 마지막 사과는 삭제되지 않게됩니다.
반복문의 조건에 해당하는 배열을 반복문 내에서 변경하게되면, 배열의 크기가 및 원소의 index가 변경될 수 있으므로 지양하시는 것을 권장드립니다.
감사합니다 :)
아! 배열 인덱스가 앞으로 당겨지는군요.
명확히 이해했습니다. 이런 코드방식은 지양해야겠군요. 실제 프로그램 개발 때에 이런 상황을 겪었다면 아찔할 뻔했네요. 친절한 설명 감사합니다. 앞으로도 꾸준히 학습하겠습니다.
좋은하루되세요!