반응형
📄 [완전탐색] 숫자 야구 C++ Source Code
#include <string>
#include <vector>
#include <iostream>
#include <unordered_set>
using namespace std;
#define INT_PAIR pair<int, int>
#define CUS_PAIR pair<string, INT_PAIR>
#define START 123
#define END 987
const bool findDigit(const INT_PAIR condition, const string target, const string match) {
INT_PAIR conds = make_pair(0, 0);
for (int ii = 0; ii < target.size(); ii++) {
for (int jj = 0; jj < match.size(); jj++) {
// Case Find Strike.
if (target[ii] == match[jj] && ii == jj) { conds.first++; break; }
// Case Find Ball.
if (target[ii] == match[jj]) { conds.second++; break; }
}
}
return condition == conds;
}
const bool checkDigit(const string target) {
unordered_set<int> number;
for (const char letter : target) {
const int digit = letter - '0';
// Case Contain Duplicate Number.
if (number.find(digit) != number.end()) { return false; }
// Case Contain Zero Number.
if (digit == 0) { return false; }
number.insert(digit);
}
return true;
}
int solution(vector<vector<int>> baseball) {
vector<CUS_PAIR> bucket = vector<CUS_PAIR>(baseball.size());
for (int ii = 0; ii < baseball.size(); ii++) {
INT_PAIR input = make_pair(0, 0);
bucket[ii].first = std::to_string(baseball[ii][0]);
bucket[ii].second = make_pair(baseball[ii][1], baseball[ii][2]);
}
/* 정답은 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수이다. */
int answer = 0;
for (int ii = START; ii <= END; ii++) {
bool isSuccess = true;
const string temp_answer = std::to_string(ii);
if (checkDigit(temp_answer) == false) { continue; }
for (const auto num : bucket) {
if (findDigit(num.second, num.first, temp_answer) == false) { isSuccess = false; break; }
}
if (isSuccess) { answer++; }
}
return answer;
}
📄 [완전탐색] 숫자 야구 Swift Source Code
import Foundation
typealias Compare = (score: [Character], strike: Int, ball: Int)
func checkDuplicate(target: [Character]) -> Bool {
for char in target where char == "0" { return true }
return (target[0] == target[1]) || (target[0] == target[2]) || (target[1] == target[2])
}
func collectScore(strike: Int, ball: Int, target: [Character], answer: [Character]) -> Bool {
let length = answer.count
var score: (strike: Int, ball: Int) = (0, 0)
for outline in 0..<length {
// MARK: - 숫자와 위치가 모두 맞을 때는 스트라이크
if answer[outline] == target[outline] { score.strike = score.strike + 1; continue }
// MARK: - 숫자는 맞지만, 위치가 틀렸을 때는 볼
for inline in 0..<length where outline != inline && answer[outline] == target[inline] { score.ball = score.ball + 1; break }
}
return score.strike == strike && score.ball == ball
}
func solution(_ baseball: [[Int]]) -> Int {
var answer = 0
// MARK: - 각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다.
let range: (start: Int, end: Int) = (100, 999)
for exception in range.start...range.end {
let bucket = Array(String(exception))
if checkDuplicate(target: bucket) { continue }
var value = 0
for target in baseball {
let compare = Compare(Array(String(target[0])), target[1], target[2])
if collectScore(strike: compare.strike, ball: compare.ball, target: compare.score, answer: bucket) {
value = value + 1
}
}
// MARK: - 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힌 경우
if value == baseball.count { answer = answer + 1 }
}
return answer
}
🚀 REFERENCE
반응형
'# 사용하지 않는 게시글 > 알고리즘 문제' 카테고리의 다른 글
[프로그래머스 - 해시] 위장 (0) | 2019.04.06 |
---|---|
[프로그래머스 - 그래프] 가장 먼 노드 (0) | 2019.04.05 |
[프로그래머스 - 정렬] K번째수 (0) | 2019.04.05 |
[프로그래머스 - 정렬] H-Index (0) | 2019.04.05 |
[프로그래머스 - 탐색] 네트워크 (0) | 2019.04.05 |
댓글