XGitHub

PaizaをGo言語で実行

Published Icon
2024-11-20
Modified Icon
2024-11-23
Tag Icon

入力の受け取り

  • 一行ずつ取得する
func main() {
	// NewScanner()でデータを読み取るScannerインスタンスを作成
	// os.Stdinはプログラムの標準入力を参照しています
	scanner := bufio.NewScanner(os.Stdin)
	// Scan()で次の行を読み取ります
	scanner.Scan()
	// Text()で読み取ったデータを取得
	text := scanner.Text()
	fmt.Println(text)
 
	scanner.Scan()
	number, _ := strconv.Atoi(scanner.Text())
	fmt.Println(number)
}
  • 半角空白でわかれているとき
func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	parts := strings.Split(scanner.Text(), " ")
	a := parts[0]
	b, _ := strconv.Atoi(parts[1])
}
  • 一文字ずつ取得する

取得する数が分かっているときはこちらのほうが記述量が少ない

func main() {
	var x, y, N int
	fmt.Scan(&x, &y, &N)
}

へび

プログラミング練習問題「へび」問題を解いてスキルアップ!みんなも一緒に解いてみよう!
faviconpaiza.jp
ogp

この問題は初期に与えられたマップ上をえびが移動し、最大 100 回行動するか障害物に当たり移動できなくなると終了するというものです。

重量な点としては、方向転換をおこなう時刻までは特定の向きに直進し続けることです。

package main
 
import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)
 
type Position struct {
	y, x int
}
 
type turn struct {
	t int
	d string
}
 
func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	cols, rows, initY, initX, count, _ := readInt(scanner.Text())
 
	grid := make([][]rune, cols)
 
	for i := 0; i < cols; i++ {
		scanner.Scan()
		grid[i] = []rune(scanner.Text())
	}
 
	turns := make([]turn, count)
 
	for i := 0; i < count; i++ {
		scanner.Scan()
		time, direction, _ := readTimeDirectionPair(scanner.Text())
		turns[i].t = time
		turns[i].d = direction
	}
 
	direction := 0             // 北向きで開始 (0: 北, 1: 東, 2: 南, 3: 西)
	dirY := []int{-1, 0, 1, 0} // Y軸は北に移動する場合に-1される
	dirX := []int{0, 1, 0, -1} // X軸は東に移動する場合に+1される
 
	head := Position{initY, initX}
	grid[head.y][head.x] = '*'
 
	var nextX, nextY int
 
	var time int = 0
	var turnIndex int = 0
 
	for time <= 99 {
		if turnIndex < count && time == turns[turnIndex].t {
			switch turns[turnIndex].d {
			case "L":
				direction = (direction + 3) % 4
			case "R":
				direction = (direction + 1) % 4
			}
			turnIndex++
		}
 
		// 次の移動先を計算
		nextX = head.x + dirX[direction]
		nextY = head.y + dirY[direction]
 
		// 移動可能かどうかのチェック
		if nextY < 0 || nextY >= cols || nextX < 0 || nextX >= rows || grid[nextY][nextX] == '#' || grid[nextY][nextX] == '*' {
			break // 移動不可
		}
 
		// 移動する
		head = Position{nextY, nextX}
		grid[head.y][head.x] = '*'
 
		time++
	}
 
	for _, line := range grid {
		fmt.Println(string(line))
	}
}
 
func readInt(line string) (int, int, int, int, int, error) {
	parts := strings.Split(line, " ")
	cols, _ := strconv.Atoi(parts[0])
	rows, _ := strconv.Atoi(parts[1])
	initY, _ := strconv.Atoi(parts[2])
	initX, _ := strconv.Atoi(parts[3])
	count, _ := strconv.Atoi(parts[4])
	return cols, rows, initY, initX, count, nil
}
 
func readTimeDirectionPair(line string) (int, string, error) {
	parts := strings.Split(line, " ")
	time, _ := strconv.Atoi(parts[0])
	return time, parts[1], nil
}
 

映画館の席の予約

package main
 
import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
	"strings"
)
 
type Position struct {
	p, q int
}
 
func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	reservedSeatCount, seatRows, seatCols, bestSeatRow, bestSeatCol, _ := readInt(scanner.Text())
 
	reserved := make(map[Position]bool)
 
	for i := 0; i < reservedSeatCount; i++ {
		scanner.Scan()
		rp, rq, _ := readInt2(scanner.Text())
		reserved[Position{rp, rq}] = true
	}
 
	minDistance := math.MaxInt
	candidates := []Position{}
 
	for p := 0; p < seatRows; p++ {
		for q := 0; q < seatCols; q++ {
			pos := Position{p, q}
			if reserved[pos] {
				continue
			}
 
			distance := absIf(p-bestSeatRow) + absIf(q-bestSeatCol)
 
			if distance < minDistance {
				minDistance = distance
				candidates = []Position{pos}
			} else if distance == minDistance {
				candidates = append(candidates, pos)
			}
		}
	}
 
	for _, seat := range candidates {
		fmt.Println(seat.p, seat.q)
	}
}
 
func readInt(line string) (int, int, int, int, int, error) {
	parts := strings.Split(line, " ")
	reservedSeatCount, _ := strconv.Atoi(parts[0])
	seatRows, _ := strconv.Atoi(parts[1])
	seatCols, _ := strconv.Atoi(parts[2])
	bestSeatRow, _ := strconv.Atoi(parts[3])
	bestSeatCol, _ := strconv.Atoi(parts[4])
	return reservedSeatCount, seatRows, seatCols, bestSeatRow, bestSeatCol, nil
}
 
func readInt2(line string) (int, int, error) {
	parts := strings.Split(line, " ")
	rp, _ := strconv.Atoi(parts[0])
	rq, _ := strconv.Atoi(parts[1])
	return rp, rq, nil
}
 
func absIf(x int) int {
	if x < 0 {
		return -x
	}
	return x
}