문제 출처: https://www.acmicpc.net/problem/12789
문제
시도
아래의 구조에 따라 코드를 작성했다.
1) Stack에 들어있는지 checker 점검
2) checker에 기록됐고, Stack 마지막에 존재한다면 Nice
3) checker에 기록됐지만, Stack 마지막에 없다면 Sad
4) checker에 없다면, 다음 번호표가 나올 때까지 넘기기
import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] arsg) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 학생 수 : N (1 ~ 1000)
int n = Integer.parseInt(br.readLine());
// 이후 학생 번호 표 N개
StringTokenizer st = new StringTokenizer(br.readLine());
Stack<Integer> line = new Stack<>();
int tmp;
int ticketNo = 1;
String result = "Nice";
while(st.hasMoreTokens()) {
if(line.contains(ticketNo)) {
if(line.lastElement() == ticketNo) {
line.pop();
ticketNo++;
}
else {
result = "Sad";
break;
}
} else {
tmp = Integer.parseInt(st.nextToken());
if(tmp == ticketNo) ticketNo++;
else {
line.push(tmp);
}
}
}
System.out.print(result);
}
}
하지만 실패가 나왔다.
풀이
이유를 곰곰이 생각해보니 반복문의 기준인 StringTokenizer의 순환이 끝났을 때 Stack에 여전히 사람이 남아있는 경우를 고려하지 않았다는 것을 생각해냈다.
import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] arsg) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 학생 수 : N (1 ~ 1000)
int n = Integer.parseInt(br.readLine());
// 이후 학생 번호 표 N개
StringTokenizer st = new StringTokenizer(br.readLine());
Stack<Integer> line = new Stack<>();
int tmp;
int ticketNo = 1;
String result = "Nice";
while(st.hasMoreTokens()) {
if(line.contains(ticketNo)) {
if(line.lastElement() == ticketNo) {
line.pop();
ticketNo++;
}
else {
result = "Sad";
break;
}
} else {
tmp = Integer.parseInt(st.nextToken());
if(tmp == ticketNo) ticketNo++;
else line.push(tmp);
}
}
while(!line.isEmpty()) {
if(line.lastElement() == ticketNo) {
line.pop();
ticketNo++;
} else {
result = "Sad";
break;
}
}
System.out.print(result);
}
}
마지막에 Stack에 남은 것들을 확인하는 로직을 추가했고 결국 96 ms로 성공했다.
알게 된 점
- 풀이 자체는 구조 짜기 10분, 시도 20분, 풀이 10분해서 총 40분이 걸렸다.
- 사실 시도까지 30분하고 실패하자 마자 다른 사람의 풀이를 참고하고 싶었지만 결국 나중엔 혼자 풀어야 하는 문제니 조금 더 고민해보자는 마음으로 매달렸고 성공하니 뿌듯했다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2580 : 스도쿠 (0) | 2023.10.31 |
---|---|
[백준] 4779 : 칸토어 집합 (0) | 2023.10.30 |
[백준] 2485 : 가로수 (1) | 2023.10.28 |
[백준] 1269 : 대칭 차집합 (0) | 2023.10.26 |
[백준] 23505 : 커트라인 + 버블 / 선택 / 삽입 정렬 알고리즘 정리 (1) | 2023.10.26 |