본문 바로가기
#알고리즘 [Algorithm]/Problem

[프로그래머스 - 완전탐색] 숫자 야구

by cy_mos 2019. 4. 5.
반응형

[프로그래머스 - 완전탐색] 숫자 야구


📄 [완전탐색] 숫자 야구 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

반응형

댓글