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 |