← Back to List

20436번: ZOAC 3 ↗

Solutions

Go
1.2 KB | 1256 chars
package main

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

var writer *bufio.Writer
var reader *bufio.Reader

func Print(a ...interface{}) {
	fmt.Fprintln(writer, a...)
}

func Abs(a int) int {
	if a < 0 {
		return -a
	}
	return a
}

func diff(a []int, b []int) int {
	return Abs(a[0]-b[0]) + Abs(a[1]-b[1])
}

func solve() {
	var pos1 = map[string][]int{
		"q": {0, 0},
		"w": {0, 1},
		"e": {0, 2},
		"r": {0, 3},
		"t": {0, 4},
		"a": {1, 0},
		"s": {1, 1},
		"d": {1, 2},
		"f": {1, 3},
		"g": {1, 4},
		"z": {2, 0},
		"x": {2, 1},
		"c": {2, 2},
		"v": {2, 3},
	}

	var pos2 = map[string][]int{
		"y": {0, 5},
		"u": {0, 6},
		"i": {0, 7},
		"o": {0, 8},
		"p": {0, 9},
		"h": {1, 5},
		"j": {1, 6},
		"k": {1, 7},
		"l": {1, 8},
		"b": {2, 4},
		"n": {2, 5},
		"m": {2, 6},
	}

	var a, b, s string

	fmt.Fscanf(reader, "%s %s\n%s", &a, &b, &s)

	left := pos1[a]
	right := pos2[b]
	ans := len(s)

	for i := 0; i < len(s); i++ {
		current := string(s[i])

		pos, ok := pos1[current]

		if ok {
			ans += diff(left, pos)
			left = pos
		}

		pos, ok = pos2[current]

		if ok {
			ans += diff(right, pos)
			right = pos
		}
	}

	Print(ans)

}

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

	solve()
}