๐Ÿ˜‰/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] โšพ (๋ฐฑ์ค€, 17281)

ruhz 2020. 11. 20. 15:40

๋ฌธ์ œ

 

17281๋ฒˆ: โšพ

โšพ๋Š” 9๋ช…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋‘ ํŒ€์ด ๊ณต๊ฒฉ๊ณผ ์ˆ˜๋น„๋ฅผ ๋ฒˆ๊ฐˆ์•„ ํ•˜๋Š” ๊ฒŒ์ž„์ด๋‹ค. ํ•˜๋‚˜์˜ ์ด๋‹์€ ๊ณต๊ฒฉ๊ณผ ์ˆ˜๋น„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์ด N์ด๋‹ ๋™์•ˆ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ํ•œ ์ด๋‹์— 3์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด๋‹์ด ์ข…

www.acmicpc.net

 

 

ํ’€์ด

 

ruhz3/CodingTest

To prepare for coding test. Contribute to ruhz3/CodingTest development by creating an account on GitHub.

github.com

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

int N;
int hitTable[50][9];
int entry[9];
vector<int> field;

int findMaxScore() {
	int outCount;
	int entryIdx = 0;
	int score = 0;

	for (int inning = 0; inning < N; inning++) {
		// ์ด๋‹์ด ์‹œ์ž‘๋˜๋ฉด, outCount์™€ ํ•„๋“œ ์ดˆ๊ธฐํ™”
		outCount = 0;
		field.clear();
		while (outCount < 3) {
			int hitScore = hitTable[inning][entry[entryIdx]];
			// ํ˜„์žฌ ์„ ์ˆ˜ ์•„์›ƒ์„ ์นœ ๊ฒฝ์šฐ
			if (hitScore == 0) {
				outCount++;
			}
			// ํ˜„์žฌ ์„ ์ˆ˜ ์•ˆํƒ€๋ฅผ ์นœ ๊ฒฝ์šฐ
			else {
				// ์„ ์ˆ˜ ํ•œ ๋ช…์„ ๋„ฃ์–ด์ฃผ๊ณ , ํ•„๋“œ ์œ„์˜ ๋ชจ๋“  ์„ ์ˆ˜ ์ง„๋ฃจ
				field.push_back(0);
				for (int i = 0; i < field.size(); i++) {
					field[i] += hitScore;
				}
				// ํ•„๋“œ ์œ„์— 4์ด์ƒ์ธ ์„ ์ˆ˜ ๋นผ์ฃผ๋ฉด์„œ ์ ์ˆ˜++
				while(!field.empty() && field[0] >= 4) {
					field.erase(field.begin());
					score++;
				}
			}
			// ๋‹ค์Œ ์„ ์ˆ˜ ์ž…์žฅ
			if (entryIdx == 8) entryIdx = 0;
			else entryIdx++;
		}
	}
	return score;
}

int makeEntry(int entryNum){
	// entry๊ฐ€ ์™„์„ฑ๋˜๋ฉด findMaxScore() ํ˜ธ์ถœ
	if (entryNum == 9) {
		return findMaxScore();
	}
	// 3๋ฒˆํƒ€์ž๋Š” 0๋ฒˆ์„ ์ˆ˜ ๊ณ ์ •
	if (entryNum == 3) {
		entry[3] = 0;
		return makeEntry(entryNum + 1);
	}
	
	int res = 0;
	bool flag;
	for (int i = 1; i < 9; i++) {
		// 0๋ฒˆ ์„ ์ˆ˜ ์ œ์™ธ, ์ด์ „ entry์— ๋„ฃ์œผ๋ ค๋Š” ์„ ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ด flag ์ €์žฅ
		flag = true;
		for (int j = 0; j < entryNum; j++) {
			if (i == entry[j])
				flag = false;
		}
		// ์—†๋‹ค๋ฉด ์„ ์ˆ˜๋ฅผ ํ•ด๋‹น entry์— ๋„ฃ๊ณ  ๋‹ค์Œ entry ์ž‘์„ฑ
		if (flag) {
			entry[entryNum] = i;
			res = max(res, makeEntry(entryNum + 1));
		}
	}
	return res;
}

int main() {
	memset(entry, -1, sizeof(entry));
	cin >> N;
	for (int inning = 0; inning < N; inning++)
		for (int player = 0; player < 9; player++)
			cin >> hitTable[inning][player];

	cout << makeEntry(0) << endl;
	return 0;
}

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

<makeEntry ํ•จ์ˆ˜>
- ์„ ์ˆ˜์˜ entry๋ฅผ ์žฌ๊ท€๋กœ ์™„์ „ํƒ์ƒ‰ํ•œ๋‹ค.
- entry๋ฅผ ๋ชจ๋‘ ๊ตฌ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด, findMaxScoreํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ returnํ•œ๋‹ค.
- ๋ฐฑํŠธ๋ž˜ํ‚นํ•˜๋ฉฐ, ํ˜ธ์ถœํ•œ ์žฌ๊ท€ํ•จ์ˆ˜์˜ return๊ฐ’๋“ค์„ ๋น„๊ตํ•˜๊ณ  ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.โ€‹

<findMaxScore ํ•จ์ˆ˜>
- ๊ฐ ์ด๋‹ ๋ณ„๋กœ while ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ๋“ค์–ด๊ฐ€๊ณ , outCount๊ฐ€ 3์ด์ƒ ๋Š˜์–ด๋‚˜๋ฉด ๋น ์ ธ๋‚˜์˜จ๋‹ค.
- ํ•„๋“œ๋Š” ๋ฒกํ„ฐ๋กœ ๊ตฌ์„ฑํ–ˆ๊ณ , ์ด๋‹์ด ๋๋‚˜๋„ ๋‹ค์Œ ํƒ€์„์— ์˜ค๋ฅผ ์„ ์ˆ˜ ์ •๋ณด๊ฐ€ ๋ณด์กด๋˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  Out์ด๋ผ๋ฉด :
   - outCount 1์ฆ๊ฐ€ ๋ฐ ๋‹ค์Œ ์„ ์ˆ˜๋กœ ๋„˜๊น€
  Out์ด ์•„๋‹ˆ๋ผ๋ฉด :
   - ์ผ๋‹จ ์„ ์ˆ˜๋ฅผ 0๋ฃจ(ํ™ˆ)์— ๋„ฃ๊ณ , n๋ฃจํƒ€๋ผ๋ฉด ๋ฒกํ„ฐ(ํ•„๋“œ)์— ์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋“ค์— n์„ ๋”ํ•œ๋‹ค(์ง„๋ฃจ).
   - 4์ด์ƒ์ธ ๊ฒฝ์šฐ ๋ฒกํ„ฐ(ํ•„๋“œ)์—์„œ ๋นผ์ฃผ๊ณ  score++
   - ๋‹ค์Œ ์„ ์ˆ˜๋กœ ๋„˜๊น€