일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- unrealengine
- fcitx
- 개발자
- chromebook
- codeserver
- 완주하지 못한 선수
- 프로그래머스
- 주석쓰기
- 전화번호 목록
- 영어 끝말잇기
- unreal config
- ELoadingPhase
- crostini
- 데비안한글
- LoadingPhase
- 에러 메시지 쓰기
- 숫자야구
- Extensions
- 리눅스한글
- 크롬북
- UE4
- 큰수 만들기
- 숫자 야구
- 개발자의 글쓰기
- SimpleConfig
- vscode
- 알고리즘
- D2Coding
- code-server
- 단체사진찍기
- Today
- Total
Space Panda
[프로그래머스] 숫자야구 본문
문제 설명
숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 게임해보기
각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
* 숫자는 맞지만, 위치가 틀렸을 때는 볼 * 숫자와 위치가 모두 맞을 때는 스트라이크 * 숫자와 위치가 모두 틀렸을 때는 아웃 |
예를 들어, 아래의 경우가 있으면
A : 123 A : 356 B : 1스트라이크 0볼.
B : 2스트라이크 0볼.
B : 0스트라이크 1볼. |
이때 가능한 답은 324와 328 두 가지입니다.
질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.
제한사항
-
질문의 수는 1 이상 100 이하의 자연수입니다.
-
baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
입출력 예
baseball | return |
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] | 2 |
입출력 예 설명
문제에 나온 예와 같습니다.
풀이
처음 문제를 볼때는 스트라이크일경우 볼일경우의 수를 먼저 생각하여 풀어야 되는줄 알았으나...
우직하게 모든경우의 수에서 가능한 경우를 뽑아내는 방식으로 풀었다.
코드를 작성한 순서는 다음과 같다
-
baseball 숫자의 스트라이크 카운트, 볼 카운트를 반환하는 GetStrikeCount(...), GetBallCount(...) 함수를 생성
-
입력 vector의 한가지 인자(vector<int>)를 받아 스트라이크, 볼 조건에 부합하는 baseball 숫자 인자(vector<int>)를 반환하는 GetPossibleBaseballNumbers(...) 함수를 생성
-
GetPossibleBaseballNumbers(...) 함수로 얻은 possibleBaseballNumbers 변수들의 합집합을 반환하는GetUnionNumbers(...) 함수 생성
-
solution 함수에서 나머지 부분 코딩
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int GetStrikeCount(int baseballNum1, int baseballNum2)
{
int strikeNum = 0;
string strBaseball1 = to_string(baseballNum1);
string strBaseball2 = to_string(baseballNum2);
for (int i = 0; i < 3; ++i)
if (strBaseball1[i] == strBaseball2[i])
++strikeNum;
return strikeNum;
}
int GetBallCount(int baseballNum1, int baseballNum2)
{
int ballNum = 0;
string strBaseball1 = to_string(baseballNum1);
string strBaseball2 = to_string(baseballNum2);
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
if (i == j)
continue;
if (strBaseball1[i] == strBaseball2[j])
++ballNum;
}
}
return ballNum;
}
vector<int> GetPossibleBaseballNumbers(vector<int> baseballCase)
{
vector<int> possibleBaseballNumbers;
for (int i = 1; i < 10; ++i)
{
for (int j = 1; j < 10; ++j)
{
if (i == j)
continue;
for (int k = 1; k < 10; ++k)
{
if (i == k)
continue;
if (j == k)
continue;
int tempBaseballNum = i * 100 + j * 10 + k;
if (baseballCase[1] == GetStrikeCount(baseballCase[0], tempBaseballNum) && baseballCase[2] == GetBallCount(baseballCase[0], tempBaseballNum))
{
possibleBaseballNumbers.push_back(tempBaseballNum);
}
}
}
}
return possibleBaseballNumbers;
}
vector<int> GetUnionNumbers(vector<int> numbers1, vector<int> numbers2)
{
vector<int> unionNumbers;
for (int i = 0; i < numbers1.size(); ++i)
{
auto it = find(numbers2.begin(), numbers2.end(), numbers1[i]);
if (it != numbers2.end())
unionNumbers.push_back(numbers1[i]);
}
return unionNumbers;
}
int solution(vector<vector<int>> baseball)
{
vector<int> possibleBaseballNumbers;
for (int i = 0; i < baseball.size(); ++i)
{
if (i == 0)
{
possibleBaseballNumbers = GetPossibleBaseballNumbers(baseball[i]);
}
else
{
possibleBaseballNumbers = GetUnionNumbers(possibleBaseballNumbers, GetPossibleBaseballNumbers(baseball[i]));
}
}
int answer = possibleBaseballNumbers.size();
return answer;
}
프로그래머스 숫자야구 URL : https://programmers.co.kr/learn/courses/30/lessons/42841
'알고리즘' 카테고리의 다른 글
[프로그래머스] 영어 끝말잇기 (0) | 2020.05.20 |
---|---|
[프로그래머스] 완주하지 못한 선수 (0) | 2020.05.20 |
[프로그래머스]큰수 만들기 (0) | 2020.05.20 |
[프로그래머스] 단체사진찍기 (0) | 2020.05.18 |
[프로그래머스]압축 (0) | 2020.05.18 |