본문 바로가기

코테

[구현] 백준 실버3 2503번: 숫자 야구(Swift)

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

 

2503번: 숫자 야구

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

www.acmicpc.net

문제 풀이

위 문제는 영수의 질문 결과를 통해 조건에 만족하는 수의 개수를 찾아 출력하는 문제이다.

먼저, 입력값과 탐색 값을 비교하여 스트라이크와 볼의 스코어를 계산하는 메서드를 구현해 준다.

func checkScore(_ target: [Character], _ num: [Character]) -> (Int, Int) {
  var sScoer = 0
  var bScoer = 0
  
  for i in 0..<3 {
    if !target.contains(num[i]) { continue }
    if i == target.firstIndex(of: num[i]) {
      sScoer += 1
    } else {
      bScoer += 1
    }
  }
  return (sScoer, bScoer)
}

(target = 탐색할 값 / num = 입력 값)

탐색 값과 입력 값을 비교하여 스트라이크와 볼의 스코어를 계산해 리턴해준다.

다음은 checkScore에서 얻은 스코어 값과 입력받은 스코어 값을 비교하는 메서드를 구현해 준다.

func checkNum(target: [Character]) -> Bool {
  for i in 0..<n {
    let score = checkScore(target, numArr[i])
    if score != scoreArr[i] { return false }
  }
  return true
}

위 메서드를 통해 스코어를 비교하고, 입력받은 스코어와 checkScore를 통해 계산한 스코어가 같다면 ture를 반환한다.

var result = [[Character]]()
 
for i in 123...987 {
  let a = Array(String(i))
  if !a.contains("0") && a[0] != a[1] && a[0] != a[2] && a[1] != a[2] {
    if checkNum(target: a) {
      result.append(a)
    }
  }
}

마지막으로 완전 탐색을 통해 조건에 부합하는 값을 result 배열에 담아 마무리한다.

숫자 야구 같은 경우 세 자릿수부터 시작하며, 중복이 없기 때문에 123 ~ 987까지 탐색하며, 0이 포함되어 있거나, 중복 수가 있는 값은 탐색에서 제외한다.

전체 코드
let n = Int(readLine()!)!
var numArr = [[Character]]()
var scoreArr = [(Int, Int)]()

for _ in 0..<n {
  let input = readLine()!.split(separator: " ")
  let num = Array(input[0])
  let s = Int(input[1])!
  let b = Int(input[2])!
  numArr.append(num)
  scoreArr.append((s, b))
}

func checkScore(_ target: [Character], _ num: [Character]) -> (Int, Int) {
  var sScoer = 0
  var bScoer = 0
  
  for i in 0..<3 {
    if !target.contains(num[i]) { continue }
    if i == target.firstIndex(of: num[i]) {
      sScoer += 1
    } else {
      bScoer += 1
    }
  }
  return (sScoer, bScoer)
}

func checkNum(target: [Character]) -> Bool {
  for i in 0..<n {
    let score = checkScore(target, numArr[i])
    if score != scoreArr[i] { return false }
  }
  return true
}

var result = [[Character]]()
 
for i in 123...987 {
  let a = Array(String(i))
  if !a.contains("0") && a[0] != a[1] && a[0] != a[2] && a[1] != a[2] {
    if checkNum(target: a) {
      result.append(a)
    }
  }
}

print(result.count)