Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Diagonal Difference

문제

N x N 크기의 정사각형이 있다. 각각의 대각선 상의 원소들의 값을 더한 값의 차이를 구하라

입력 형식

  1. 표준입력으로 정사각형의 크기 N을 입력받는다.
  2. 1에서 입력한 N 만큼 row를 입력한다.
  3. N x N 행렬이 만들어진다.

출력

대각선의 원소들의 값을 더한 값의 차이를 출력한다.

입력 예

3
11 2 4
4 5 6
10 8 -12

출력 예

15

풀이

 풀이

(1 + 6 + 4) - (3 + 6 + 21) 연산에 대한 절대 값을 취하는 방법이 있다. 하지만 이 방법은 각 대각선 연산결과를 따로 유지해야 하므로 두 개의 배열이 필요하다.

그냥 각 배열을 순환 할 적에, 차이를 구한 다음에 더하기 연산을 하면, 메모리를 절약 할 수 있을 것이다.
package main

import (
    "fmt"
)

func abs(a int) int {
    if a < 0 {
        a = a * -1
    }
    return a
}

func main() {
    a := [][]int{[]int{1, 2, 3}, []int{5, 6, 10}, []int{21, 3, 4}}
    sum := 0
    for k, v := range a {
        sum += v[k] - v[len(a)-(k+1)]
    }
    fmt.Println(abs(sum))
}

표준입력으로 값을 읽도록 수정하면 완성이다.
package main

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

func abs(a int) int {
    if a < 0 {
        a = a * -1
    }
    return a
}

func main() {
    reader := bufio.NewReader(os.Stdin)
    line, _, _ := reader.ReadLine()
    n, _ := strconv.Atoi(string(line))

    sum := 0
    for i := 0; i < n; i++ {
        line, _, _ = reader.ReadLine()
        sr := strings.Split(string(line), " ")

        item1, _ := strconv.Atoi(sr[i])
        item2, _ := strconv.Atoi(sr[n-(i+1)])
        sum += (item1 - item2)
    }

    fmt.Println(abs(sum))
}

재귀로 풀어보자.
package main

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

func abs(a int) int {
    if a < 0 {
        a = a * -1
    }
    return a
}

func diagonalDifference(reader *bufio.Reader, n int) int {
    if n == 0 {
        return 0
    }
    line, _, _ := reader.ReadLine()
    sr := strings.Split(string(line), " ")
    itemn := len(sr)

    item1, _ := strconv.Atoi(sr[itemn-n])
    item2, _ := strconv.Atoi(sr[n-1])
    return (item1 - item2) + diagonalDifference(reader, n-1)
}

func main() {
    reader := bufio.NewReader(os.Stdin)
    line, _, _ := reader.ReadLine()
    n, _ := strconv.Atoi(string(line))

    fmt.Println(abs(diagonalDifference(reader, n)))
}