실습1 - Dart 문법 Q9의 코드 관련 문의
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가 변경될 수 있으므로 지양하시는 것을 권장드립니다.
감사합니다 :)
1
아! 배열 인덱스가 앞으로 당겨지는군요.
명확히 이해했습니다. 이런 코드방식은 지양해야겠군요. 실제 프로그램 개발 때에 이런 상황을 겪었다면 아찔할 뻔했네요. 친절한 설명 감사합니다. 앞으로도 꾸준히 학습하겠습니다.
좋은하루되세요!
회차마다 있는 실습
1
38
2
user-not-found, wrong-password 코드가 더 이상 반환되지 않습니다
1
70
2
SharedPreferences prefs 초기화 시기 문제
1
84
2
index로 삭제하게 되면, index가 고정되어 있으니 문제가 발생하지 않나요?
1
62
2
API 사이트가 안되네요
1
77
2
잘 되다가 sharedPreferences부터 에러
1
63
2
기존의 프로젝트
1
63
2
I/O라는 창이 윈도우에서는 없어요
1
61
2
수강 기간 연장 부탁드립니다.
1
59
2
설정 질문
1
55
2
수강 기간 연장 신청 요청드립니다.
1
49
2
수강기간 연장 부탁드립니다.
1
54
2
수강기간 연장 부탁드립니다.
1
55
2
수강기간 연장 부탁 드립니다.^^
1
66
3
강의계획 문의
1
63
2
안녕하세요. 강의 연장 문의드립니다..
1
72
2
수강기간 연장 부탁드립니다!
1
78
2
2회차 StatefulWidget 예제 dartpad 코드와 영상에서의 코드가 다릅니다.
2
95
2
dartpad 에러
1
103
2
cmd에 flutter doctor 입력하면 바로 튕겨버립니다...
1
108
2
애뮬레이터 실행시 무한로딩
1
132
2
저는 강사님 처럼 화면이 안뜨는데 머테리얼 버전이 다른걸까요??
1
64
2
수강기간 연장 부탁드립니다!
1
58
2
수강기간 연장 부탁드립니다.
1
68
2





