πŸ•οΈ ICPC Sinchon/Simulation

[BOJ S3][C++] λ°±μ€€ 2503번: 숫자 야ꡬ (2%, 4%)

선달 2022. 10. 6. 18:00
λ°˜μ‘ν˜•

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

 

2503번: 숫자 야ꡬ

첫째 μ€„μ—λŠ” λ―Όν˜μ΄κ°€ μ˜μˆ˜μ—κ²Œ λͺ‡ λ²ˆμ΄λ‚˜ μ§ˆλ¬Έμ„ ν–ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 1 이상 100 μ΄ν•˜μ˜ μžμ—°μˆ˜ N이 주어진닀. μ΄μ–΄μ§€λŠ” N개의 μ€„μ—λŠ” 각 μ€„λ§ˆλ‹€ λ―Όν˜μ΄κ°€ μ§ˆλ¬Έν•œ μ„Έ 자리 μˆ˜μ™€ μ˜μˆ˜κ°€ λ‹΅ν•œ 슀트

www.acmicpc.net

 

문제

정보문화진ν₯원 정보 영재 λ™μ•„λ¦¬μ—μ„œ 동아리 ν™œλ™μ„ ν•˜λ˜ μ˜μˆ˜μ™€ λ―Όν˜μ΄λŠ” μ‰¬λŠ” μ‹œκ°„μ„ ν‹ˆνƒ€ μˆ«μžμ•Όκ΅¬ κ²Œμž„μ„ ν•˜κΈ°λ‘œ ν–ˆλ‹€.

  • μ˜μˆ˜λŠ” 1μ—μ„œ 9κΉŒμ§€μ˜ μ„œλ‘œ λ‹€λ₯Έ 숫자 μ„Έ 개둜 κ΅¬μ„±λœ μ„Έ 자리 수λ₯Ό λ§ˆμŒμ†μœΌλ‘œ μƒκ°ν•œλ‹€. (예: 324)
  • λ―Όν˜μ΄λŠ” 1μ—μ„œ 9κΉŒμ§€μ˜ μ„œλ‘œ λ‹€λ₯Έ 숫자 μ„Έ 개둜 κ΅¬μ„±λœ μ„Έ 자리 수λ₯Ό μ˜μˆ˜μ—κ²Œ λ¬»λŠ”λ‹€. (예: 123)
  • λ―Όν˜μ΄κ°€ λ§ν•œ μ„Έ 자리 μˆ˜μ— μžˆλŠ” μˆ«μžλ“€ 쀑 ν•˜λ‚˜κ°€ 영수의 μ„Έ 자리 수의 λ™μΌν•œ μžλ¦¬μ— μœ„μΉ˜ν•˜λ©΄ 슀트라이크 ν•œ 번으둜 μ„Όλ‹€. μˆ«μžκ°€ 영수의 μ„Έ 자리 μˆ˜μ— 있긴 ν•˜λ‚˜ λ‹€λ₯Έ μžλ¦¬μ— μœ„μΉ˜ν•˜λ©΄ λ³Ό ν•œ 번으둜 μ„Όλ‹€.

예) μ˜μˆ˜κ°€ 324λ₯Ό κ°–κ³  있으면 

  • 429λŠ” 1 슀트라이크 1 볼이닀.
  • 241은 0 슀트라이크 2 볼이닀.
  • 924λŠ” 2 슀트라이크 0 볼이닀.
  • μ˜μˆ˜λŠ” λ―Όν˜μ΄κ°€ λ§ν•œ μˆ˜κ°€ λͺ‡ 슀트라이크 λͺ‡ 볼인지λ₯Ό λ‹΅ν•΄μ€€λ‹€.
  • λ―Όν˜μ΄κ°€ 영수의 μ„Έ 자리 수λ₯Ό μ •ν™•ν•˜κ²Œ λ§žμΆ”μ–΄ 3 μŠ€νŠΈλΌμ΄ν¬κ°€ 되면 κ²Œμž„μ΄ λλ‚œλ‹€. μ•„λ‹ˆλΌλ©΄ λ―Όν˜μ΄λŠ” μƒˆλ‘œμš΄ 수λ₯Ό 생각해 λ‹€μ‹œ μ˜μˆ˜μ—κ²Œ λ¬»λŠ”λ‹€.

ν˜„μž¬ λ―Όν˜μ΄μ™€ μ˜μˆ˜λŠ” κ²Œμž„μ„ ν•˜κ³  μžˆλŠ” 도쀑에 μžˆλ‹€. λ―Όν˜μ΄κ°€ μ˜μˆ˜μ—κ²Œ μ–΄λ–€ μˆ˜λ“€μ„ λ¬Όμ–΄λ³΄μ•˜λŠ”μ§€, 그리고 각각의 λ¬ΌμŒμ— μ˜μˆ˜κ°€ μ–΄λ–€ λŒ€λ‹΅μ„ ν–ˆλŠ”μ§€κ°€ μž…λ ₯으둜 주어진닀. 이 μž…λ ₯을 λ°”νƒ•μœΌλ‘œ μ—¬λŸ¬λΆ„μ€ μ˜μˆ˜κ°€ μƒκ°ν•˜κ³  μžˆμ„ κ°€λŠ₯성이 μžˆλŠ” μˆ˜κ°€ 총 λͺ‡ κ°œμΈμ§€λ₯Ό μ•Œμ•„λ§žν˜€μ•Ό ν•œλ‹€.

μ•„λž˜μ™€ 같은 경우λ₯Ό μƒκ°ν•΄λ³΄μž.  

  • 민혁: 123
  • 영수: 1 슀트라이크 1 λ³Ό.
  • 민혁: 356
  • 영수: 1 슀트라이크 0 λ³Ό.
  • 민혁: 327
  • 영수: 2 슀트라이크 0 λ³Ό.
  • 민혁: 489
  • 영수: 0 슀트라이크 1 λ³Ό.

μ΄λ•Œ κ°€λŠ₯ν•œ 닡은 324와 328, μ΄λ ‡κ²Œ 두 가지이닀.

μ˜μˆ˜λŠ” λ™μ•„λ¦¬μ˜ κ·œμœ¨μ„ 잘 λ”°λ₯΄λŠ” μ°©ν•œ 아이라 민혁이의 λ¬ΌμŒμ— κ³§μ΄κ³§λŒ€λ‘œ μ •μ§ν•˜κ²Œ λ‹΅ν•œλ‹€. κ·ΈλŸ¬λ―€λ‘œ 영수의 λ‹΅λ“€μ—λŠ” λͺ¨μˆœμ΄ μ—†λ‹€.

민혁이의 λ¬ΌμŒλ“€κ³Ό 각각의 λ¬ΌμŒμ— λŒ€ν•œ 영수의 닡이 μž…λ ₯으둜 μ£Όμ–΄μ§ˆ λ•Œ μ˜μˆ˜κ°€ μƒκ°ν•˜κ³  μžˆμ„ κ°€λŠ₯성이 μžˆλŠ” λ‹΅μ˜ 총 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” λ―Όν˜μ΄κ°€ μ˜μˆ˜μ—κ²Œ λͺ‡ λ²ˆμ΄λ‚˜ μ§ˆλ¬Έμ„ ν–ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 1 이상 100 μ΄ν•˜μ˜ μžμ—°μˆ˜ N이 주어진닀. μ΄μ–΄μ§€λŠ” N개의 μ€„μ—λŠ” 각 μ€„λ§ˆλ‹€ λ―Όν˜μ΄κ°€ μ§ˆλ¬Έν•œ μ„Έ 자리 μˆ˜μ™€ μ˜μˆ˜κ°€ λ‹΅ν•œ 슀트라이크 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜μ™€ 볼의 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜, μ΄λ ‡κ²Œ 총 μ„Έ 개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 주어진닀.

좜λ ₯

첫 쀄에 μ˜μˆ˜κ°€ μƒκ°ν•˜κ³  μžˆμ„ κ°€λŠ₯성이 μžˆλŠ” λ‹΅μ˜ 총 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

 

2%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ κ°€ λœ¬λ‹€λ©΄

정닡이 될 수 μžˆλŠ” μˆ«μžλŠ”

숫자 0이 ν¬ν•¨λ˜μ§€ μ•Šκ³  μ„œλ‘œλ‹€λ₯Έ μˆ«μžλ“€λ‘œ μ΄λ£¨μ–΄μ Έμ•Όν•œλ‹€λŠ”

쑰건이 μžˆλ‹€λŠ”μ μ— μœ μ˜ν•˜μž

 

4%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ κ°€ λœ¬λ‹€λ©΄

μˆ«μžμ—΄μ— 0이 ν¬ν•¨λ˜μ§€ μ•Šμ•„μ•Όν•œλ‹€λŠ” 쑰건을 μœ μ˜ν•˜μž

(λ³Έ ν’€μ΄μ—μ„œλŠ” int κ°€ μ•„λ‹Œ string으둜 μ²˜λ¦¬ν•΄μ€¬κΈ°μ— ansString[0]=='0' 이면 μ œμ™Έμ‹œν‚€λ„λ‘ μ½”λ“œλ₯Ό μ§°λ‹€.)

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

struct input {
    string number;
    int strike;
    int ball;
};

int n;
vector<input> v;

// μ •λ‹΅λ¬Έμžμ—΄μ΄ i번째 μΌ€μ΄μŠ€μ— ν•΄λ‹Ήν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
bool isCaseRight(int i, string ansString) {
        string num = v[i].number;
        int b=0, s=0;
        
        for(int j=0; j<3; j++) {
            for(int k=0; k<3; k++) {
                if(num[j]==ansString[k]) {
                    if(j==k)
                        s++;
                    else
                        b++;
                }
            }
        }
        
        if(b==v[i].ball && s==v[i].strike)
            return true;
        return false;
}

// i개의 μΌ€μ΄μŠ€μ€‘ 단 ν•˜λ‚˜λΌλ„ μ•ˆλ§žμœΌλ©΄ false
bool isNumRight(string ansString) {
    for(int i=0; i<n; i++)
        if(!isCaseRight(i, ansString))
            return false;
    return true;
}

int solution() {
    int ans=0;
    
    for(int i=123; i<999; i++) {
        // 닡이될 수 μžˆλŠ” λ¬Έμžμ—΄λ“€μ„ μ „λΆ€ λ‹€ λŒμ•„λ³Έλ‹€. (λΆ€λ₯΄νŠΈν¬μŠ€)
        string ansString = to_string(i);
        
        // λ‹΅ μˆ«μžμ—΄μ—λŠ” 숫자 0을 μ œμ™Έν•œ μ„œλ‘œ λ‹€λ₯Έ 숫자둜 μ΄λ£¨μ–΄μ Έμžˆμ–΄μ•Όν•œλ‹€.
        if(ansString[0]=='0' || ansString[1]=='0' || ansString[2]=='0')
            continue;
        if(ansString[0]==ansString[1] || ansString[1]==ansString[2] || ansString[2]==ansString[0])
            continue;
        
        if(isNumRight(ansString))
            ans++;
    }
    
    return ans;
}

int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> n;
    for(int i=0; i<n; i++) {
        string n;
        int s,b;
        cin >> n >> s >> b;
        v.push_back({n,s,b});
    }
    
    cout << solution();
    
    return 0;
}

/*
 */

 

λ°˜μ‘ν˜•