
Description
Code
package main
import (
"bufio"
"os"
"fmt"
"strings"
"strconv"
)
var (
sc = bufio.NewReader(os.Stdin)
wr = bufio.NewWriter(os.Stdout)
Stack []int
)
func push(x int) {
Stack = append(Stack, x)
}
func pop() int {
if len(Stack) == 0 {
return 0
}
x := Stack[len(Stack)-1]
Stack = Stack[:len(Stack)-1]
return x
}
func top() int {
if len(Stack) == 0 {
return 0
}
return Stack[len(Stack) -1]
}
func main() {
defer wr.Flush()
var N int
fmt.Fscanln(sc, &N) // 승환이 앞에 있는 학생들의 수
line, _ := sc.ReadString('\n') // 학생들의 번호표를 입력 받음
line = strings.TrimSpace(line) // 뒤에 개행문자 제거
nums := strings.Split(line, " ") // 공백을 기준으로 문자열을 나눔
cnt := 1 // 현재 줄을 서야 하는 순서
for _, v := range nums {
x, _ := strconv.Atoi(v)
// 현재 줄을 서야 하는 순서와 순번이 일치하면
if cnt == x {
cnt++
continue
}
for len(Stack) != 0 && cnt == top() {
cnt++
pop()
}
push(x)
}
if len(Stack) == 0 {
fmt.Fprintln(wr, "Nice")
} else {
fmt.Fprintln(wr, "Sad")
}
return
}
- 스택 구현:
- push(x): 번호표 x를 스택에 추가함.
- pop(): 스택의 맨 위에 있는 번호표를 제거하고 반환함.
- top(): 스택의 맨 위에 있는 번호표를 반환하되, 스택이 비어 있으면 0을 반환함.
- 입력 처리:
- 첫 번째 입력 값 N은 승환이 앞에 서 있는 학생들의 수를 나타냄.
- 다음 줄에 학생들의 번호표가 공백으로 구분되어 입력됨.
- 알고리즘 흐름:
- 번호표 순서를 나타내는 cnt를 1로 초기화함.
- 각 번호표를 순회하며,
- 현재 번호표가 cnt와 일치하면 바로 줄을 섬(cnt++).
- 그렇지 않으면 스택에서 cnt와 일치하는 번호표를 찾을 때까지 제거(pop()).
- 일치하는 번호표가 없으면 현재 번호표를 스택에 추가(push(x)).
- 모든 학생의 번호표 처리가 끝난 후에도 스택이 비어 있지 않으면 번호표 순서가 맞지 않음.
- 결과 출력:
- 스택이 비어 있으면 모든 학생이 올바른 순서대로 줄을 섰으므로 "Nice"를 출력함.
- 스택에 남아 있는 번호표가 있으면 순서대로 줄을 설 수 없으므로 "Sad"를 출력함.