태그
- 예외처리
- 센티넬 기법(조건 범위를 활용한 예외처리)
- 구현
풀이 1 (일반 구현)
문제에서 표현하는 대로 문제를 풀고자 하면 아래와 같은 다이어그램 흐름대로 해결하게 된다.
아래는 위의 다이어그램의 Mermaid 코드이다.
graph TD
B --x |X 이전 문제를
해결하지 못함|A
A[2] --> |O|B[-1]
A --> |O|ㅁ[3]
A --x |X 이전 해결 시간보다
짧을 수 없음|ㅊ[1]
아래는 문제풀이 코드이다.
static void solve() throws Exception {
int iter = scan.nextInt();
int sincerityTeamCount = 0;
for (int i = 0; i < iter; i++) {
int curSolveTime = -1;
boolean sincerity = true;
boolean cantSolve = false;
boolean solveAtLeastOne = false;
for (int j = 0; j < 3; j++) {
int solveTime = scan.nextInt();
if((curSolveTime > solveTime && solveTime > -1) || (cantSolve && solveTime >-1)){
sincerity = false;
}
curSolveTime = solveTime;
if(curSolveTime == -1){
cantSolve = true;
} else{
solveAtLeastOne = true;
}
}
if(!solveAtLeastOne)
sincerity = false;
sincerityTeamCount += sincerity ? 1 : 0;
System.out.println(sincerity);
}
System.out.println(sincerityTeamCount);
}
풀이 2 (센티넬 기법 활용)
틀린 해결방법은 아니며 실무상황의 경우 이러한 방식으로 작성하는 것이 좋지만, 아래 2가지의 실패하는 상황을 모두 구현해야 한다는 단점이 있다.
- A → -1 → B (A,B≥0) : 이전 문제를 해결하지 못함
- 1→3→2 : 이전 해결 시간보다 짧을 수 없음
2가지 실패하는 상황을 단순화할 수 있는 방법이 있다.
바로 센티넬 기법을 활용하여 문제해결실패를 의미하는 T = -1 값을 121로 조정하는것(조건범위 외의 121이상 어떤 값이라도 좋다.)
이렇게 하면 50 → 121 → 100 의 케이스를 예로 들면,
해당 케이스의 실패 사유는 논리적으로는 이전 문제를 해결하지 못한 것이 이유지만, 물리적으로는 이전 해결 시간보다 짧을 수 없다는 조건에 어차피 걸리게 된다.
static void solve() throws Exception {
int iter = scan.nextInt();
int[] solveTime = new int[3];
int sincerityTeamCount = 0;
for (int i = 0; i < iter; i++) {
for (int j = 0; j < 3; j++) {
solveTime[j] = scan.nextInt();
}
boolean solveAtLeastOne = false;
for (int j = 0; j < 3; j++) {
if(solveTime[j] == -1)
solveTime[j] = 121;
else
solveAtLeastOne = true;
}
boolean sincerity = true;
for (int j = 0; j < 2; j++) {
if(solveTime[j+1] < solveTime[j])
sincerity = false;
}
sincerityTeamCount += sincerity && solveAtLeastOne ? 1:0;
}
System.out.println(sincerityTeamCount);
}