๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[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;
}