Swift) 백준 2503번 숫자 야구 - S3

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

문제 요약:

  • 1~9까지의 서로 다른 숫자로 이루어진 3자리 숫자가 목표 수
  • 입력으로는 3자리 숫자와 스트라이크, 볼의 개수가 주어짐
  • 입력된 값을 토대로 정답이 될 수 있는 숫자의 개수를 묻는 문제

풀이 과정:

  1. 서로 다른 숫자로 이루어진 수만이 들어가므로 순열을 이용해서 서로 다른 숫자로 이루어진 3자리 가능한 숫자 배열을 구함.
  2. 입력을 받을때마다 가능한 숫자 배열을 반복문으로 돌면서 입력된 수와 가능한 숫자를 서로 비교하여 스트라이크와 볼의 개수를 구함.
let inputArr = Array(num)
        let compareArr = Array(item)
        for i in 0..<3 {
            if inputArr[i] == compareArr[i] {
                compareStrike += 1
            } else {
                if compareArr.contains(inputArr[i]) {
                    compareBall += 1
                }
            }
        }

4. 비교한 결과 스트라이크의 개수 또는 볼의 개수가 맞지 않을 시 해당 숫자를 배열에서 제거

5. 다 돌구 난 후 가능한 숫자 배열의 개수 출력

 

전체 코드

import Foundation

let n = Int(readLine()!)!
var numArr: [String] = []
var isVisited: [Bool] = Array(repeating: false, count: 10)

func permutation(combi: String, depth: Int) {
    if depth == 3 {
        numArr.append(combi)
        return
    }
    for i in 1...9 {
        if !isVisited[i] {
            isVisited[i] = true
            let appendCombi = combi+"\(i)"
            permutation(combi: appendCombi, depth: depth+1)
            isVisited[i] = false
        }
    }
}

permutation(combi: "", depth: 0)

for _ in 0..<n {
    let input = readLine()!.split(separator: " ").map { Int($0)! }
    let num = "\(input[0])"
    let strike = input[1]
    let ball = input[2]
    
    for item in numArr {
        var compareStrike = 0
        var compareBall = 0
        let inputArr = Array(num)
        let compareArr = Array(item)
        for i in 0..<3 {
            if inputArr[i] == compareArr[i] {
                compareStrike += 1
            } else {
                if compareArr.contains(inputArr[i]) {
                    compareBall += 1
                }
            }
        }
        if compareStrike != strike || compareBall != ball {
            numArr.remove(at: numArr.firstIndex(of: item)!)
        }
    }
}

print(numArr.count)