๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•
ํ•ด๋‹น ๊ธ€์˜ ๋‚ด์šฉ์€ ์ตœ์ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ๊ธ€์“ด์ด์˜ ์ฃผ๊ด€์ ์ธ ํ’€์ด์ž…๋‹ˆ๋‹ค. ๋” ์ข‹์€ ํ’€์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค(__)

 

๋งํฌ


https://www.acmicpc.net/problem/2798

 

2798๋ฒˆ: ๋ธ”๋ž™์žญ

๋ฌธ์ œ ์นด์ง€๋…ธ์—์„œ ์ œ์ผ ์ธ๊ธฐ ์žˆ๋Š” ๊ฒŒ์ž„ ๋ธ”๋ž™์žญ์˜ ๊ทœ์น™์€ ์ƒ๋‹นํžˆ ์‰ฝ๋‹ค. ์นด๋“œ์˜ ํ•ฉ์ด 21์„ ๋„˜์ง€ ์•Š๋Š” ํ•œ๋„ ๋‚ด์—์„œ, ์นด๋“œ์˜ ํ•ฉ์„ ์ตœ๋Œ€ํ•œ ํฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒŒ์ž„์ด๋‹ค. ๋ธ”๋ž™์žญ์€ ์นด์ง€๋…ธ๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ๊ทœ์ •์ด ๏ฟฝ๏ฟฝ

www.acmicpc.net

 

 

 

 

๋ฌธ์ œ ์„ค๋ช…


 ์นด์ง€๋…ธ์—์„œ ์ œ์ผ ์ธ๊ธฐ ์žˆ๋Š” ๊ฒŒ์ž„ ๋ธ”๋ž™์žญ์˜ ๊ทœ์น™์€ ์ƒ๋‹นํžˆ ์‰ฝ๋‹ค. ์นด๋“œ์˜ ํ•ฉ์ด 21์„ ๋„˜์ง€ ์•Š๋Š” ํ•œ๋„ ๋‚ด์—์„œ, ์นด๋“œ์˜ ํ•ฉ์„ ์ตœ๋Œ€ํ•œ ํฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒŒ์ž„์ด๋‹ค. ๋ธ”๋ž™์žญ์€ ์นด์ง€๋…ธ๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ๊ทœ์ •์ด ์žˆ๋‹ค.

 

 ํ•œ๊ตญ ์ตœ๊ณ ์˜ ๋ธ”๋ž™์žญ ๊ณ ์ˆ˜ ๊น€์ •์ธ์€ ์ƒˆ๋กœ์šด ๋ธ”๋ž™์žญ ๊ทœ์น™์„ ๋งŒ๋“ค์–ด ์ƒ๊ทผ, ์ฐฝ์˜์ด์™€ ๊ฒŒ์ž„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 ๊น€์ •์ธ ๋ฒ„์ „์˜ ๋ธ”๋ž™์žญ์—์„œ ๊ฐ ์นด๋“œ์—๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋‹ค. ๊ทธ๋‹ค์Œ, ๋”œ๋Ÿฌ๋Š” N์žฅ์˜ ์นด๋“œ๋ฅผ ๋ชจ๋‘ ์ˆซ์ž๊ฐ€ ๋ณด์ด๋„๋ก ๋ฐ”๋‹ฅ์— ๋†“๋Š”๋‹ค. ๊ทธ๋Ÿฐ ํ›„์— ๋”œ๋Ÿฌ๋Š” ์ˆซ์ž M์„ ํฌ๊ฒŒ ์™ธ์นœ๋‹ค.

 ์ด์ œ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ œํ•œ๋œ ์‹œ๊ฐ„ ์•ˆ์— N์žฅ์˜ ์นด๋“œ ์ค‘์—์„œ 3์žฅ์˜ ์นด๋“œ๋ฅผ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค. ๋ธ”๋ž™์žญ ๋ณ€ํ˜• ๊ฒŒ์ž„์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๊ณ ๋ฅธ ์นด๋“œ์˜ ํ•ฉ์€ M์„ ๋„˜์ง€ ์•Š์œผ๋ฉด์„œ M๊ณผ ์ตœ๋Œ€ํ•œ ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

N์žฅ์˜ ์นด๋“œ์— ์จ์ ธ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, M์„ ๋„˜์ง€ ์•Š์œผ๋ฉด์„œ M์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์šด ์นด๋“œ 3์žฅ์˜ ํ•ฉ์„ ๊ตฌํ•ด ์ถœ๋ ฅํ•˜์‹œ์˜ค.

 

 

 

์ œํ•œ ์กฐ๊ฑด


 ์ž…๋ ฅ: ์ฒซ์งธ ์ค„์— ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(3 ≤ N ≤ 100)๊ณผ M(10 ≤ M ≤ 300,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์นด๋“œ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ๊ฐ’์€ 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.

 ํ•ฉ์ด M์„ ๋„˜์ง€ ์•Š๋Š” ์นด๋“œ 3์žฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

 

 ์ถœ๋ ฅ: ์ฒซ์งธ ์ค„์— M์„ ๋„˜์ง€ ์•Š์œผ๋ฉด์„œ M์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์šด ์นด๋“œ 3์žฅ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

์ž…์ถœ๋ ฅ ์˜ˆ


<์ž…๋ ฅ 1>

5 21
5 6 7 8 9

 

 

 

<์ถœ๋ ฅ 1>

21

 

 

 

 

ํ’€์ด


[Golang]

package main

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

var (
	M int
	NumSlice []int
	MinDiff = math.MaxInt32
	Min = math.MaxInt32
)

func abs(a int, b int) int {
	if a > b {
		return a - b
	} else {
		return b - a
	}
}

func calculate(step int, index int, sum int) bool {
	if sum > M {
		return false
	}
	if step == 3 {
		diff := abs(M, sum)
		if MinDiff > diff {
			MinDiff = diff
			Min = sum
		}
		if diff == 0 {
			return true
		} else {
			return false
		}
	}

	for i := index; i < len(NumSlice); i++ {
		if i + (3 - (step+1)) > len(NumSlice) - 1 {
			continue
		}
		isEnd := calculate(step+1, i+1, sum+NumSlice[i])
		if isEnd {
			return true
		}
	}

	return false
}

func main() {
	r := bufio.NewReader(os.Stdin)
	var n int

	_, _ = fmt.Fscanf(r, "%d %d\n", &n, &M)

	NumSlice = make([]int, n)
	for i := 0; i < n; i++ {
		_, _ = fmt.Fscanf(r, "%d", &NumSlice[i])
	}

	for i := 0; i < len(NumSlice); i++ {
		calculate(1, i+1, NumSlice[i])
	}
	fmt.Print(Min)
}

 

[C++]

#include <iostream>

int n, m;
int arr[100];
int minDiff = 300000 * 100;
int min = 300000 * 100;

int abs(int a, int b)
{
	if (a > b)
	{
		return a - b;
	}
	else
	{
		return b - a;
	}
}

bool calculate(int step, int index, int sum)
{
	if (sum > m)
	{
		return false;
	}
	if (step == 3)
	{
		int diff = abs(m, sum);
		if (minDiff > diff)
		{
			minDiff = diff;
			min = sum;
		}
		if (diff == 0)
		{
			return true;
		}
		else {
			return false;
		}
	}

	for (int i = index; i < n; i++)
	{
		if(i + (3 - (step+1)) > n - 1)
		{
			continue;
		}
		bool isEnd = calculate(step + 1, i + 1, sum + arr[i]);
		if (isEnd)
		{
			return true;
		}
	}

	return false;
}

int main()
{
	std::cin.tie(NULL);
	std::ios::sync_with_stdio(false);
	std::cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		std::cin >> arr[i];
	}

	for (int i = 0; i < n; i++)
	{
		calculate(1, i + 1, arr[i]);
	}
	std::cout << min;
	return 0;
}

 

 

 

 

ํ’€์ด ์„ค๋ช…


 ์ฃผ์–ด์ง„ ์ˆซ์ž์—์„œ 3๊ฐœ๋ฅผ ๋ฝ‘์•„ ๊ฐ€์žฅ M๊ณผ ๊ฐ€๊นŒ์šด ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค. ๋ฌธ์ œ์—๋„ ์ฃผ์–ด์กŒ๋“ฏ์ด ๋ณต์žก๋„๋Š” nC3๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ๊ฐ€์ค‘์น˜(step)๋ฅผ ๋‘์–ด์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ํ’€์—ˆ๋‹ค. (์ด๋•Œ M๊ณผ ํ•ฉ์˜ ์ฐจ๊ฐ€ 0์ด๋ฉด ๋ฌด์กฐ๊ฑด ๊ฐ€๊นŒ์šด ๊ฐ’์ด๋ฏ€๋กœ return ๊ฐ’์„ true๋กœ ํ•˜์—ฌ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๋„๋ก ํ•˜์˜€๋‹ค.)

๋ฐ˜์‘ํ˜•