(프로그래머스 코딩테스트 고득점 kit) 완전탐색 Level3 숫자 야구
by 줌코딩
문제
숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 게임해보기
각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
- 숫자는 맞지만, 위치가 틀렸을 때는 볼
- 숫자와 위치가 모두 맞을 때는 스트라이크
- 숫자와 위치가 모두 틀렸을 때는 아웃
예를 들어, 아래의 경우가 있으면
- A : 123
- B : 1스트라이크 1볼.
- A : 356
- B : 1스트라이크 0볼.
- A : 327
- B : 2스트라이크 0볼.
- A : 489
- B : 0스트라이크 1볼.
이때 가능한 답은 324와 328 두 가지입니다.
질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.
제한사항 질문의 수는 1 이상 100 이하의 자연수입니다. baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
문제 이해
- 일단 123 부터 987까지 다 훑어서 가능성 있는 애들을 찾아봅니다
- 근데 찾은 애가 0을 가지고 있을 수도 있으니 그런 애들은 걸러주고요!
- 반복된 숫자가 있는 친구가 있을테니 걔네들도 걸러주세요~
문뜩 코드(점수: 100점)
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> baseball) {
int answer = 0;
for(int i = 123; i < 987; i++){
bool good = true;
for(int j = 0; j < baseball.size(); j++){
int strike = 0;
int ball = 0;
string n1 = to_string(i);
string n2 = to_string(baseball[j][0]);
for(int k = 0; k < 3; k ++){
if(n1.at(k) == n2.at(k)) {
strike ++;
continue;
}
for(int l = 0; l < 3; l++){
if(n1.at(k) == n2.at(l)){
ball ++;
break;
}
}
}
if(strike == baseball[j][1] && ball == baseball[j][2]);
else {
good = false;
break;
}
}
if(good) {
string s = to_string(i);
for(int j = 0; j < s.length(); j++){
if(s.at(j) == '0'){
good = false;
break;
}
for(int k = 0; k < s.length(); k++){
if(j == k) continue;
if(s.at(j) == s.at(k)){
good =false;
break;
}
}
}
if(good)answer ++;
}
}
return answer;
}
느낀점
- 브루트 폴스는 문뜩 드는 생각으로 끝낼 수 있었다아ㅏㅏㅋㅋ
- 4중 for문이라니 너무 즐겁다 ㅋㅋㅋ 이렇게 완전탐색도 끝낸다 고생했다!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Subscribe via RSS