[BOJ] 2096번 : 내려가기(Go, Golang)

김영한·2021년 3월 8일
0

알고리즘

목록 보기
16/74

문제 링크 : 백준 2096번

[문제 접근]

메모리 제한이 작아서 입력을 배열에다 할당하지 않고 바로 연산해야한다.
크기가 3인 max배열과 min배열을 만들어준다.
3개의 입력을 받고 dp스럽게 진행하면 된다.

  1. max배열과 min배열의 값을 따로 받아놓고 진행한다.
  2. 0번째 인덱스는 전단계 0번째와 1번째 인덱스에서 올 수 있다.(최대값이면 큰것, 최소값이면 작은 것을 가져온다.)
  3. 1번째 인덱스는 전단계 0번째와 1번째와 2번째 인덱스에서 올 수 있다.(최대값이면 큰것, 최소값이면 작은 것을 가져온다.)
  4. 2번째 인덱스는 전단계 1번째와 2번째 인덱스에서 올 수 있다.(최대값이면 큰것, 최소값이면 작은 것을 가져온다.)
  5. 입력을 모두 받은 후 max, min배열에서 가장 큰 값과 작은 값을 출력해주면 된다.

⭐️ Go의 fmt패키지의 Scanf, Print는 매우 느려서 bufio를 사용해서 입출력 해야 시간초과가 발생하지 않는다.

[소스 코드]

package main

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

var n int
var in int
var maxarr, minarr [3]int

func max(a int, b int) int {
	if a < b {
		return b
	} else {
		return a
	}
}

func min(a int, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}

func main() {
	r := bufio.NewReader(os.Stdin)
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()

	fmt.Fscanf(r, "%d\n", &n)
	fmt.Fscanf(r, "%d %d %d\n", &maxarr[0], &maxarr[1], &maxarr[2])
	minarr[0] = maxarr[0]
	minarr[1] = maxarr[1]
	minarr[2] = maxarr[2]

	for i := 1; i < n; i++ {
		var a, b, c int
		fmt.Fscanf(r, "%d %d %d\n", &a, &b, &c)
		temp1 := maxarr[0]
		temp2 := maxarr[1]
		temp3 := maxarr[2]
		maxarr[0] = max(temp1, temp2) + a
		maxarr[1] = max(max(temp1, temp2), temp3) + b
		maxarr[2] = max(temp2, temp3) + c

		temp1 = minarr[0]
		temp2 = minarr[1]
		temp3 = minarr[2]
		minarr[0] = min(temp1, temp2) + a
		minarr[1] = min(min(temp1, temp2), temp3) + b
		minarr[2] = min(temp2, temp3) + c
	}
	fmt.Fprintf(w, "%d %d\n", max(max(maxarr[0], maxarr[1]), maxarr[2]), min(min(minarr[0], minarr[1]), minarr[2]))
}

0개의 댓글