Go/Go 알고리즘

백준 10845번 큐 Go 구현해보기

kimc 2021. 11. 8. 00:17

```

백준 10845번 큐 Go 구현해보기

```

 

이번 글을 통해 배워갈 내용

  1.  백준 10845번 큐 풀이
  2.  간단한 큐 연습

https://www.acmicpc.net/problem/10845

 

10845번: 큐

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

 

 

백준 10845번은 

난이도 실버 등급의 문제로서

 

큐를 구현하면 되는 문제입니다.

 

큐는 FIFO으로서 

말 그대로 먼저 들어온 게 먼저 나가는 자료구조입니다.

 


30분 정도 위에 링크를 방문하셔서 풀어보시고

안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


Push, Pop, size, empty, front, back 등의 명령어에 따라

아래에 구현된 Switch문과 Que 구조체의 함수를 연결해서

풀었습니다.

 

개인적으로는 List container를 que처럼 쓰는 것을 편하다 느끼지만

연습 삼아서 큐 자료구조를 한번 만들어 보았습니다.

 

 

 

전체 코드는 다음과 같습니다

package main

import (
	"bufio"
	"fmt"
	"os"
)

// Que

type Que [] int64

func NewQue(cap int) *Que {
	que := make(Que, 0, cap)
	return &que
}

func (que *Que) Push(elem int64){
	*que = append(*que, elem)
}

func (que *Que) Pop() int64{
	poppedElem := (*que)[0]
	*que = (*que)[1:]
	return poppedElem
}

func (que *Que) Front() int64{
	return (*que)[0]
}

func (que *Que) Back() int64{
	return (*que)[len(*que)-1]
}

func (que *Que) Len() int{
	return len(*que)
}

func (que *Que) isEmpty() bool{
	isEmpty := true
	if(len(*que) > 0){
		isEmpty = false
	}
	return isEmpty
}

func processCommand(que *Que, commandStr *string, commandNum int64) string{
	var retStr string = ""
	
	switch *commandStr {
	case "push":
		{
			que.Push(commandNum)
		}
	case "pop":
		{
			if(que.isEmpty()){
				retStr = "-1"
			}else{
				retStr = fmt.Sprintf("%v", que.Pop())
			}
		}
	case "size":
		{
			retStr = fmt.Sprintf("%v", que.Len())
		}
	case "empty":
		{
			if(que.isEmpty()){
				retStr = "1"
			}else{
				retStr = "0"
			}
		}
	case "front":
		{
			if(que.isEmpty()){
				retStr = "-1"
			}else{
				retStr = fmt.Sprintf("%v", que.Front())
			}
		}
	case "back":
		{
			if(que.isEmpty()){
				retStr = "-1"
			}else{
				retStr = fmt.Sprintf("%v", que.Back())
			}
		}
	}

	return retStr
}


func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)

	que := NewQue(2)

	var numberOfCommands int
	fmt.Fscanln(reader, &numberOfCommands)
	for i := 0; i < numberOfCommands; i++ {
		var commandStr string
		var commandNum int64
		fmt.Fscanln(reader, &commandStr, &commandNum)
		outputStr := processCommand(que, &commandStr, commandNum)

		if(outputStr != ""){
			fmt.Fprintln(writer, outputStr)
		}

	}

	
	writer.Flush()
}

 

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 

참조 및 인용

Introduction to Algorithms


https://tour.golang.org/list

 

A Tour of Go

 

tour.golang.org

https://tour.golang.org/moretypes/13

 

A Tour of Go

 

tour.golang.org

https://stackoverflow.com/questions/2818852/is-there-a-queue-implementation

 

Is there a queue implementation?

Can anyone suggest Go container for simple and fast FIF/queue, Go has 3 different containers: heap, list and vector. Which one is more suitable to implement a queue?

stackoverflow.com

 

728x90