leetcode , 백준

[Go] 28279 덱 2

_HelloWorld_ 2025. 1. 7. 17:02

Description


Code

package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
)

type Deque struct {
	head *DequeNode
	tail *DequeNode
	size int
}

type DequeNode struct {
	data int 
	next *DequeNode
	prev *DequeNode
}

var (
	deq *Deque = new(Deque)
)

// 1: 정수 x를 덱의 앞에
func push_front(x int) {
	newNode := new(DequeNode)
	newNode.data = x
	if deq.size == 0 {
		deq.head = newNode
		deq.tail = newNode
	} else {
		newNode.next = deq.head
		deq.head.prev = newNode
		deq.head = newNode
	}
	deq.size++
}

// 2: 정수 x를 덱의 뒤에
func push_back(x int) {
	newNode := new(DequeNode)
	newNode.data = x
	if deq.size == 0 {
		deq.head = newNode
		deq.tail = newNode
	} else {
		newNode.prev = deq.tail
		deq.tail.next = newNode
		deq.tail = newNode
	}
	deq.size++
}

// 3: 덱에 정수가 있다면 맨 앞의 정수 빼고 출력, 없다면 -1 출력
func pop_front() int {
	if deq.size == 0 {
		return -1
	}
	ret := deq.head.data
	deq.head = deq.head.next
	deq.size--
	return ret
}

// 4: 덱의 정수가 있다면 맨 뒤의 정수를 빼고 출력, 없다면 -1 출력
func pop_back() int {
	if deq.size == 0 {
		return -1
	}
	ret := deq.tail.data
	deq.tail = deq.tail.prev
	deq.size--
	return ret
}

// 5: 덱에 들어있는 정수 개수 출력
func size() int {
	return deq.size
}

// 6: 덱이 비어있으면 1, 아니면 0 출력
func empty() int {
	if deq.size == 0 {
		return 1
	}
	return 0
}

// 7: 덱의 가장 앞에 있는 정수 출력, 없다면 -1 출력
func front() int {
	if deq.size == 0 {
		return -1
	}
	return deq.head.data
}

// 8: 덱의 가장 뒤에 있는 정수 출력, 없다면 -1 출력
func back() int {
	if deq.size == 0 {
		return -1
	}
	return deq.tail.data
}

func main() {
	sc := bufio.NewScanner(os.Stdin)
	wr := bufio.NewWriter(os.Stdout)

	defer wr.Flush() 


	var N int
	if sc.Scan() {
		N, _ = strconv.Atoi(sc.Text())
	}

	for ; N != 0; N-- {
		sc.Scan()
		tmp := strings.Fields(sc.Text())
		switch tmp[0] {
			case "1":
				temp_int, _ := strconv.Atoi(tmp[1])
				push_front(temp_int)
			case "2":
				temp_int, _ := strconv.Atoi(tmp[1])
				push_back(temp_int)
			case "3":
				wr.WriteString(strconv.Itoa(pop_front()))
				wr.WriteByte('\n')
			case "4":
				wr.WriteString(strconv.Itoa(pop_back()))
				wr.WriteByte('\n')
			case "5":
				wr.WriteString(strconv.Itoa(size()))
				wr.WriteByte('\n')
			case "6":
				wr.WriteString(strconv.Itoa(empty()))
				wr.WriteByte('\n')
			case "7":
				wr.WriteString(strconv.Itoa(front()))
				wr.WriteByte('\n')
			case "8":
				wr.WriteString(strconv.Itoa(back()))
				wr.WriteByte('\n')
		}
	}
	return
}

/*
# 문자열 공백 포함 입력 받기
if sc.Scan() {
	tmp := sc.Text()
	wr.WriteString(tmp)
}
*/

코드 동작 설명

1. 덱의 연산 구현

  • push_front(x):
    정수 x를 덱의 맨 앞에 삽입.
    • size == 0일 경우, head와 tail을 새로운 노드로 설정.
    • 그 외의 경우, 기존 head 앞에 새로운 노드를 추가하고 head를 갱신.
  • push_back(x):
    정수 x를 덱의 맨 뒤에 삽입.
    • size == 0일 경우, head와 tail을 새로운 노드로 설정.
    • 그 외의 경우, 기존 tail 뒤에 새로운 노드를 추가하고 tail을 갱신.
  • pop_front():
    덱의 맨 앞 정수를 제거하고 반환.
    • size == 0이면 -1 반환.
    • 그 외의 경우, head를 다음 노드로 이동하고, size 감소.
  • pop_back():
    덱의 맨 뒤 정수를 제거하고 반환.
    • size == 0이면 -1 반환.
    • 그 외의 경우, tail을 이전 노드로 이동하고, size 감소.
  • 기타 연산:
    • size(): 덱에 들어있는 정수 개수 반환.
    • empty(): 덱이 비어있으면 1, 아니면 0 반환.
    • front(): 덱의 맨 앞 정수를 반환 (size == 0이면 -1).
    • back(): 덱의 맨 뒤 정수를 반환 (size == 0이면 -1).

2. 명령어 처리 흐름

  • 입력:
    첫 줄에 명령어 개수 N 입력. 이후 각 줄에 명령어가 주어짐.
    • "1 x": x를 덱의 앞에 삽입.
    • "2 x": x를 덱의 뒤에 삽입.
    • "3": 덱의 앞 정수를 제거하고 출력.
    • "4": 덱의 뒤 정수를 제거하고 출력.
    • "5": 덱의 정수 개수를 출력.
    • "6": 덱이 비어있는지 여부를 출력.
    • "7": 덱의 앞 정수를 출력.
    • "8": 덱의 뒤 정수를 출력.
  • 출력:
    각 명령어의 결과를 출력.

'leetcode , 백준' 카테고리의 다른 글

[Go] 2346 풍선 터뜨리기  (0) 2025.01.08
[Go] 11866 요세푸스 문제 0  (0) 2025.01.03
[Go] 18258 큐 2  (0) 2025.01.03
[Go] 4949 균형잡힌 세상  (0) 2025.01.03
[Go] 10773 제로  (0) 2025.01.03