๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๊ตฌ๋ฆ„ ์ฑŒ๋ฆฐ์ง€

[๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€] 3์ฃผ์ฐจ ํ•™์Šต ์ผ๊ธฐ #1 (11์ผ์ฐจ)

by ๋Œ€๋ณต2 2023. 8. 28.

๋ฌธ์ œ ๋งํฌ

 

๊ตฌ๋ฆ„LEVEL

๋‚œ์ด๋„๋ณ„ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ SW ์—ญ๋Ÿ‰์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

level.goorm.io

 

๋ฌธ์ œ ์„ค๋ช…

8์ผ ์ฐจ์˜ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ด๋ฒˆ์—” ์•„์ดํ…œ์˜ ๊ฐ์†Œ ์ˆ˜์น˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค.

 

 

์ž…๋ ฅ 

  • N์˜ ๋ฒ”์œ„๋Š” 2๋ถ€ํ„ฐ 10์˜ 6 ์ œ๊ณฑ๊นŒ์ง€์ด๋‹ค.
  • ์•„์ดํ…œ A, B์˜ ๋ฒ”์œ„๋Š” 2 <= A < B <= 13์ด๋‹ค.

 

์ถœ๋ ฅ

ํ†ต์ฆ์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์•„์ดํ…œ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ์ดํ•ด

์ฒ˜์Œ์—” ์ด์ „ ํ†ต์ฆ ๋ฌธ์ œ๊ณผ ๊ฐ™์ด ๋‹จ์ˆœ ๋นผ๊ธฐ ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋นผ๊ธฐ ์—ฐ์‚ฐ๋งŒ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ์— ์žˆ๋Š” ์˜ˆ์ œ ์ค‘ 10000, 4, 13๊ณผ ๊ฐ™์ด 0์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹จ์ˆœ ๊ณ„์‚ฐ์œผ๋กœ 0์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ์˜ ํ’€์ด ๋ฐฉ์‹์„ ๋ฐ”๊ฟ”์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

1. ์ฒ˜์Œ์— ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž๋ฅผ 2 x n  + 7 x  m๋กœ ๋‚˜๋ˆ„์–ด ๋ณธ๋‹ค.

2. ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟจ์„ ๋•Œ, ์•„์ดํ…œ์˜ ์ตœ์†Œ๋Š” n + m์ด ๋  ๊ฒƒ์ด๋‹ค.

 

n๊ณผ m์„ ๊ฐ๊ฐ 0๋ถ€ํ„ฐ ๋Œ€์ž…ํ•ด์„œ ๋‹ต์„ ๋„์ถœํ•ด๋ณด๋ฉด ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. 

์ด ๋ถ€๋ถ„์—์„œ ์œ ์ถ”ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์œผ๋กœ๋Š”

  • ์ˆซ์ž๊ฐ€ 2์”ฉ ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค N์€ 1์”ฉ ๋”ํ•ด์ง„๋‹ค.
  • ์ˆซ์ž๊ฐ€ 7์”ฉ ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค M์€ 1์”ฉ ๋”ํ•ด์ง„๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ ์ˆซ์ž๊ฐ€ 2๋งŒํผ ๋‚ด๋ ค๊ฐ€๋ฉด N์€ 1์„ ๋นผ์•ผ ํ•œ๋‹ค. (M์˜ ๊ฒฝ์šฐ๋„ ๋™์ผ)
  • ๊ทธ๋ ‡๋‹ค๋ฉด ์›ํ•˜๋Š” ์ˆซ์ž i์˜ ๊ฐ’์€ i -2 ๋‚˜ i - 7์˜ ๊ฐ’์— 1์„ ๋”ํ•˜๋ฉด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.
  • ์›ํ•˜๋Š” ์ˆซ์ž๋ฅผ ๋ฝ‘๊ธฐ ์œ„ํ•ด ์ž‘์€ ์ˆซ์ž๋“ค์˜ ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ„๊ณ ( ์†Œ๋ฌธ์ œ ), ์ด์ „์˜ ์ตœ์ ์˜ ๋‹ต์ด ๋‹ค์Œ์˜ ์ตœ์ ์˜ ๋‹ต์— ์˜ํ–ฅ์„ ์ค€๋‹ค.  => DP๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์กฐ๊ฑด๋“ค๋กœ ์‹์„ ๋งŒ๋“ค์–ด๋ณด๋ฉด 

pain(i) = pain(i - 2) + 1

             or

pain(i) = pain(i - 7) + 1

์ด๋ผ๋Š” ์‹์ด ๋„์ถœ๋˜๊ณ  ์ด๋ฅผ ์ •๋ฆฌํ•˜๋ฉด 

                 pain(i - A) + 1   (i – A์˜ ์ด์ „ ์—ฐ์‚ฐ์ด 0 ์ด ์•„๋‹ ๋•Œ)

pain(i) =         or

                 pain(i - B) + 1   (i – B์˜ ์ด์ „ ์—ฐ์‚ฐ์ด 0 ์ด ์•„๋‹ ๋•Œ)

 

์˜ ํ˜•์‹์œผ๋กœ ์ •๋ฆฌํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ

์ ํ™”์‹์„ ์™„์„ฑํ•œ ๋’ค๋ถ€ํ„ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š๋‹ค.

 

์›ํ•˜๋Š” ์ˆซ์ž n์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ A ์•„์ดํ…œ๊ณผ B ์•„์ดํ…œ์— ๋Œ€ํ•ด ์—ฐ์‚ฐํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

๋ฌธ์ œ ํ›„๊ธฐ

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋– ์˜ฌ๋ฆฌ๊ธฐ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์ ํ™”์‹์„ ์งœ๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ œ์— ํ•ด๋‹นํ•˜๋Š” ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋งŽ์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์™ธ์—๋„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋‚˜ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์„ค์ • ๊ฐ™์€ ์‚ฌ์†Œํ•œ ์ด์Šˆ๋“ค๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ณ„์† ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜์—ฌ ํ˜ผ๋ž€ํ–ˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#define MAX 1000002
int item[MAX];
int A_item;
int B_item;
using namespace std;

void DP(int n){
	item[0] = 0;

	for(int i = A_item; i <= n; i++){
		if(item[i - A_item] != -1){
			item[i] = item[i-A_item] + 1;
			//cout << i << ", " << item[i] << endl;
		}
		if(i >= B_item){
			if(item[i - B_item] != -1){
					item[i] = item[i-B_item] + 1;
					//cout << i << ", " << item[i] << endl;
		  }
		}
	}
}
int main() {
	int n;
	int count = 0;
	cin >> n;
	cin >> A_item >> B_item;
	fill_n(item, n + 1, -1);
        DP(n);
	cout << item[n] << endl;
}