본문 바로가기
데일리 프로그래밍

[백준][15953] 상금 헌터 [Golang]

by Loper Lee 2018. 11. 21.

백준 15953

입력 조건

  1. 제이지가 상상력을 발휘하여 가정한 횟수 T(1 ≤ T ≤ 1,000)

  2. 다음 T개 줄에는 한 줄에 하나씩 제이지가 해본 가정에 대한 정보가 주어진다.

입력 조건 해석

1번 입력의 경우 제이지가 가정한 계산의 횟수, 2번 조건의 경우 출전한 대회에서 몇등을 했는지에 대한 조건이다.

풀이

우선 예제입력과 출력을 살펴보자

예제입력의 첫번째줄은 6 즉 6번의 상황을 가정하여 계산한다.

이후 입력되는 2번째줄의 입력값은 8 4 이다.

1회의경우 8번째는 4등에 해당하기 때문에 상금은 50만원, 2회의 경우 4번째는 3등에 해당하여 상금은 128만원이다.

위 상금을 합하여 계산하면 총 상금은 1,780,000원이다.

예제 출력을 첫번째줄을 살펴보면 해당 식이 맞다는걸 확인할 수 있다.

코드

Go Version


package main



import "fmt"



// 미리 상금과 인원을 정의해둠

type festival struct {

    prize     int

    people    int

}

var reward = [][]festival{

    {

        {500, 1},

        {300, 2},

        {200, 3},

        {50, 4},

        {30, 5},

        {10, 6},

    },

    {

        {512, 1},

        {256, 2},

        {128, 4},

        {64, 8},

        {32, 16},

    },

}





func main() {

    var scan_idx int

    // 입력을 받음

    fmt.Scanln(&scan_idx)



    // 입력받은 값을 빼가며 반복 시작

    for ;scan_idx>=1;scan_idx--  {

        ranks := [2]int{0, 0}

        fmt.Scanln(&ranks[0], &ranks[1])



        fmt.Println(((getFestivalPrize(0, ranks[0]) + getFestivalPrize(1, ranks[1])) * 10000))

    }

}



// 정의 해둔 상금을 획득하기 위한 함수

func getFestivalPrize(row, rank int) int {

    if rank == 0 {

        // 0일때는 상금이 없음

        return 0

    }

    festNum := reward[row]

    lastPeople := 0

    for _, num := range festNum {

        // 사람수를 더해가며 현재 랭킹이 작거나 같다면 해당등수이므로 상금을 줌

        if rank <= lastPeople + num.people {

            return num.prize

        }

        lastPeople = lastPeople + num.people

    }

    return 0

}