-
2022년 7월 16일 TIL - 반복문의 조건 변수는 고정된 값을 사용하는 것이 좋다Today I Learned 2022. 7. 16. 23:57
이월 4주차 월요일 코딩 도장 문제 문자열 내림차순으로 배치하기를 오늘에서야 풀어서 제출했다. 문자열의 내용을 각 문자의 순서대로 정렬해주는 메서드를 사용하지 않고, 문자 하나하나를 새로운 배열에 넣는데 이미 배열에 들어가있는 문자들과의 순서를 고려해서 어느 위치에 들어가도록 할지 결정하는 방법으로 푸는 것을 시도했다.
월요일 일과시간 동안 문제를 제출했지만 일부 테스트 케이스는 맞고 일부 테스트 케이스는 틀리는 것을 확인했다. 예외 케이스에 대한 처리를 해주지 않았거나, 논리 구조상에 일부 허점이 있을 수 있을 것이라는 생각이 들었다. 오늘 소스코드의 구조를 다시 확인해본 결과 의도하지 않은 동작을 발생시키는 구조를 확인해 해당 부분을 바로잡은 결과 모든 테스트를 통과하는 것을 확인할 수 있었다. 어떤 부분이 문제였을까?
모든 테스트 케이스를 통과하지 못한 소스코드는 다음과 같다.
public String solution(String text) { List<Character> wordsList = new LinkedList<>(); for (int i = 0; i < text.length(); i += 1) { char word = text.charAt(i); if (i == 0) { wordsList.add(word); continue; } for (int j = 0; j < wordsList.size(); j += 1) { if ((j == 0) && word >= wordsList.get(j)) { wordsList.add(0, word); break; } if ((j >= 1) && (j <= wordsList.size() - 1) && word >= wordsList.get(j)) { wordsList.add(j, word); break; } if ((j == wordsList.size() - 1) && word < wordsList.get(j)) { wordsList.add(word); } } } String answer = ""; for (Character word : wordsList) { answer += word; } return answer; }
위의 소스코드에서 가장 핵심이 되는 부분은 변수 j의 상태에 따라 반복되는 내부의 for 반복문이다. String 변수 word의 문자 하나를 가져와 List에 입력된 문자들 각각과 비교해 List의 어느 위치에 문자를 삽입할 것인지 결정한다. 세 개의 if문은 각각 word를 List의 맨 처음에, 혹은 j번째 위치에, 혹은 가장 마지막 위치에 문자를 삽입하도록 하는 구문이다. 문자를 삽입했으면 해당 단어의 위치는 결정된 것이므로 반복문을 탈출해 다음 단어를 가져오도록 한다.
마지막 if문은 for문의 반복 인덱스 변수 j가 List의 크기 - 1 값과 같아질 때에만 조건에 걸리면 수행되는 구조이므로 해당 if문에 걸리면 단어를 추가해주고 자연스럽게 for문이 종료될 것이라 생각했다. 그러나 소스코드를 실행시켰을 때, 특정 문자가 하나가 아니라 2개가 출력되는 이슈가 있었다.
문제는 반복문의 조건 검사에 사용되는 변수인 List였다. 반복문의 조건 검사는 인덱스 변수 j를 List의 크기와 비교함으로써 이루어졌는데, 반복문 내에서 List에 단어를 더해주면 List의 크기는 1이 증가하게 된다. 이것이 의미하는 바는, 마지막 if문을 수행하면서 List에 단어를 더해주고 나면 List의 크기가 1이 증가하기 때문에, 반복 조건 검사에서 종료 조건에 해당되지 않게 되고 반복문을 한번 더 수행한다는 것이었다. 반복문을 한번 더 수행하면서 다른 if문의 조건에 걸리게 되어 문자를 List에 한번 더 추가한 뒤에야 break에 걸려서 for문을 탈출하는 것이었다. 이 문제는 마지막 if문에도 List에 문자를 더해준 뒤 명시적으로 break를 해주는 식으로 해결할 수 있었다.
반복문의 조건 검사에 사용되는 변수가 반복문을 수행하면서 그 값에 변화가 있게 된다면, 오늘 겪었던 문제처럼 특정 경우에 반복문이 의도한 대로 작동하지 않을 수 있다. 따라서 반복 조건 변수에는 가급적이면 반복문 내의 작업이 조건 변수의 상태에는 영향을 주지 못하도록 상수를 사용하거나 반복문 종료 조건을 확실하게 해야 할 것이다.
'Today I Learned' 카테고리의 다른 글
2022년 7월 18일 TIL - MVP는 '핵심 가치'를 드러내는 '완성된' 제품이다 (0) 2022.07.18 2022년 7월 17일 TIL (0) 2022.07.17 2022년 7월 15일 TIL - 어떻게 해야 기록을 잘 할 것인가? (0) 2022.07.15 2022년 7월 14일 TIL - 지나친 추상화는 오히려 가독성을 저해한다 (0) 2022.07.14 2022년 7월 13일 TIL - 무엇을 시도해도 안 될 때는 눈 딱 감고 뒤로 돌아가기 (0) 2022.07.13