[BOJ] ์ˆซ์ž ์•ผ๊ตฌ(2503)

[๋ฐฑ์ค€(BOJ)] ์ˆซ์ž ์•ผ๊ตฌ(2503) C++

๋ฌธ์ œ : BOJ_2503๋ฒˆ ์ˆซ์ž ์•ผ๊ตฌ

๋ฌธ์ œ ์„ค๋ช…

์™„์ „ํƒ์ƒ‰

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” ์•ผ๊ตฌ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์„ธ ์ž๋ฆฌ ์ˆซ์ž๋ฅผ ๋งž์ถฐ์•ผํ•˜๊ณ , ๊ฐ ์ž๋ฆฌ์˜ ์ˆ˜๋Š” ์ค‘๋ณต์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
n๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ˆซ์ž๋งˆ๋‹ค ๋ณผ๊ณผ ์ŠคํŠธ๋ผ์ดํฌ๊ฐ€ ์ฃผ์–ด์ง€๊ณ ,
n๊ฐœ์˜ ์ˆซ์ž ๋’ค์— ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋‹ต์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


Solution

n์˜ ์ตœ๋Œ“๊ฐ’์ด 100, ์„ธ์ž๋ฆฌ ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’์€ 111~999์ธ๋ฐ,
์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ผ๊ณ  ํ•ด๋„
100 * 888 = 88,800์ž„์œผ๋กœ ์™„์ „ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” ์ฒ˜์Œ์— n๋งˆ๋‹ค stirke์˜ ์ˆ˜์™€ ball์˜ ์ˆ˜์—
๋”ฐ๋ฅธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ์กฐ๊ฑด๋ฌธ์„ ์งœ๋ดค์ง€๋งŒ,
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๊ณ , ๊ฐ n๋งˆ๋‹ค ์ฒดํฌ๋˜์ง€์•Š์€ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋Œ๋ฉด์„œ, ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด ์ •๋‹ต์—์„œ ํƒˆ๋ฝ์‹œํ‚ค๋Š” ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์„ธ ์ž๋ฆฌ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์”ฉ ์ฒดํฌํ•˜๋ฉด์„œ, ์ŠคํŠธ๋ผ์ดํฌ์˜ ๊ฐœ์ˆ˜์™€ ๋ณผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ์•„๋ณด๊ณ , ์ฃผ์–ด์ง„ input๊ณผ ๋งž์ง€์•Š๋‹ค๋ฉด ๊ทธ ์ˆ˜๋Š” ์ •๋‹ต์—์„œ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.


Description

  1. ๊ฐ ์ž๋ฆฌ ์ˆ˜ ๋งˆ๋‹ค 0์ด ํ—ˆ์šฉ๋˜์ง€์•Š์œผ๋ฏ€๋กœ, ์‚ผ์ค‘ํฌ๋ฌธ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ฐ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋†”๋‘๋ฉด wrong answer๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ, ๊ฐ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋„ ์ •๋‹ต์—์„œ ์ œ์™ธ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
#include <iostream>
using namespace std;
int vis[1000]; // vis=1 ์ด๋ผ๋ฉด ์ •๋‹ต์—์„œ ์ œ์™ธ๋œ ์ˆ˜
int res = 9 * 9 * 9; // ์ž๋ฆฌ์ˆ˜๊ฐ€ ์ค‘๋ณต๋˜๋Š” ์ˆ˜ ์—ญ์‹œ ์ •๋‹ต์˜ ๊ฐ€์ง“์ˆ˜์—์„œ ๋บ„ ๊ฒƒ ์ด๋ฏ€๋กœ 9*9*9
int main(void) {
	int N;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		int num;
		scanf("%d", &num);
		int firstNum = num / 100;
		int secondNum = (num / 10) % 10;
		int thirdNum = num % 10;
		int strike, ball;
		scanf("%d%d", &strike, &ball);
		for (int j = 1; j <= 9; j++) {
			// 3์ค‘ ํฌ๋ฌธ์œผ๋กœ ์ „์ฒด ์ˆ˜ ํ™•์ธ (์ž๋ฆฌ์ˆ˜์—์„œ ์ค‘๋ณต๋˜๋Š” ์ˆ˜๋Š” ๋งˆ์ง€๋ง‰ ํฌ๋ฌธ์—์„œ ์ œ์™ธ)
			for (int k = 1; k <= 9; k++) {
				for (int l = 1; l <= 9; l++) {
					int value = 100 * j + 10 * k + l;
					if (vis[value]) continue;
					if (j == k || j == l || k == l) {
						// ์ž๋ฆฌ์ˆ˜์—์„œ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ •๋‹ต์—์„œ ์ œ์™ธ
						vis[value] = 1;
						res--;
						continue;
					}
					int nowStrike = 0;
					int nowBall = 0;
					int isStrike[1000] = { 0, };
					if (j == firstNum) {
						nowStrike++;
						isStrike[j]++;
					}
					if (k == secondNum) {
						nowStrike++;
						isStrike[k]++;
					}
					if (l == thirdNum) {
						nowStrike++;
						isStrike[l]++;
					}
					if (!isStrike[j]) {
						if (j == secondNum || j == thirdNum) nowBall++;
					}
					if (!isStrike[k]) {
						if (k == firstNum || k == thirdNum) nowBall++;
					}
					if (!isStrike[l]) {
						if (l == firstNum || l == secondNum) nowBall++;
					}
					if (strike == nowStrike && ball == nowBall) continue;
					else {
						vis[value]++;
						res--;
					}
				}
			}
		}
	}
	printf("%d\n", res);
	return 0;
}