카테고리 없음

[Go] 12789 도키도키 간식드리미

_HelloWorld_ 2025. 1. 3. 14:16

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을 반환함.
  • 입력 처리:
    1. 첫 번째 입력 값 N은 승환이 앞에 서 있는 학생들의 수를 나타냄.
    2. 다음 줄에 학생들의 번호표가 공백으로 구분되어 입력됨.
  • 알고리즘 흐름:
    1. 번호표 순서를 나타내는 cnt를 1로 초기화함.
    2. 각 번호표를 순회하며,
      • 현재 번호표가 cnt와 일치하면 바로 줄을 섬(cnt++).
      • 그렇지 않으면 스택에서 cnt와 일치하는 번호표를 찾을 때까지 제거(pop()).
      • 일치하는 번호표가 없으면 현재 번호표를 스택에 추가(push(x)).
    3. 모든 학생의 번호표 처리가 끝난 후에도 스택이 비어 있지 않으면 번호표 순서가 맞지 않음.
  • 결과 출력:
    • 스택이 비어 있으면 모든 학생이 올바른 순서대로 줄을 섰으므로 "Nice"를 출력함.
    • 스택에 남아 있는 번호표가 있으면 순서대로 줄을 설 수 없으므로 "Sad"를 출력함.