알고리즘을 풀고 특정 플랫폼에서 테스트 케이스를 돌리다 보면 마음대로 return 타입을 void
로 지정할 수 없고, 테스트 케이스를 통과하기 위해 정해진 return 타입을 준수해야 하는 경우가 많았다.
이런 경우에는 보통 break;
하여 루프문을 빠져나온 뒤 답을 return해주었다.
루프문에서 바로 답을 return 후, 메서드의 return문에서는 null이나 0을 return하는 방법도 생각해보았는데, CSR
방식으로 웹 렌더링을 구현할 때도 기능 작동은 성공했지만 프론트에 전송할 데이터가 없을 때(Ex.수정, 삭제) null을 전송하는 것보다도 아예 데이터를 보내지 않는 것이 낫다고 생각했다.
그래서 루프문에서 바로 return 처리하기 보다는 break하는 방식을 선택했던 것이다.
그런데 Programmers
에서 다른 사람들의 풀이를 구경하다가 생각해보지 못했던 코드를 발견했다.
그럼에도 루프문 안에서 바로 답을 return하고 싶다면, 루프문 안에서 바로 return 처리한 후, 메서드의 return문에서는 throw Exception
으로 강제로 예외를 발생시켜주는 것이다.
답을 발견했을 시 루프문 안에서 바로 return처리를 하도록 설계했음에도 메서드의 return문까지 코드가 내려갔다는 것은 풀이가 제대로 되지 않았다는 것이기 때문이다.(답이 올바르게 도출되지 않은 상황)
이것이 가독성 면에서도, 그리고 타인에게 의미를 전달하기에도 null이나 0을 return 하는 것보다 훨씬 좋은 방법인 것 같았다.
Programmers Coding Test Practice - Printer (Stack/Queue)
public int solution(int[] priorities, int location) {
List<Integer> list = new ArrayList<>();
for (int priority : priorities) {
list.add(priority);
}
int turn = 1;
while (!list.isEmpty()) {
final Integer j = list.get(0);
if (list.stream().anyMatch(v -> j < v)) {
list.add(list.remove(0));
} else {
if (location == 0) {
return turn;
}
list.remove(0);
turn++;
}
if (location > 0) {
// target이 comparator와 비교했을 때 더 크든 작든 list.remove()를 진행하므로
// 주어진 인수 location(=인덱스) 조정
location--;
// location이 0일 때 location에 해당하는 수가 가장 큰 수라면, return turn;으로 바로 리턴했을 것
// 그러나 return 되지 않고 여기 왔다는 건 리스트의 맨 마지막 요소로 추가됐다는 것
} else {
location = list.size() - 1;
}
}
throw new IllegalArgumentException();
}
위 코드에서 답이 도출되는 조건
1.대기목록 list
에서 가장 큰 수
2. 초기 배열 priorites
의 priorites[location]
에 해당하는 요소
이 두 가지를 만족할 때만 조건문 안에서 return turn;
으로 답을 return하는 코드였다.
그리고 메서드의 return문까지 내려가는 경우에는 비정상적인 경우이므로,
/**
* Thrown to indicate that a method has been passed an illegal or
* inappropriate argument.
*
* @since 1.0
*/
public class IllegalArgumentException extends RuntimeException {
/**
* Constructs an {@code IllegalArgumentException} with no
* detail message.
*/
public IllegalArgumentException() {
super();
}
메서드에 건네받은 인자가 적합하지 않다는 IllegalArgumentException
을 발생시킨 것이다.
위 코드를 보고 비정상적인 상황(예외 상황)에서 적절한 예외를 발생시키는 것도 좋은 코드를 구현하는 능력 중 하나라는 생각이 들었다.