https://www.acmicpc.net/problem/2503
문제 풀이
위 문제는 영수의 질문 결과를 통해 조건에 만족하는 수의 개수를 찾아 출력하는 문제이다.
먼저, 입력값과 탐색 값을 비교하여 스트라이크와 볼의 스코어를 계산하는 메서드를 구현해 준다.
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)
'코테' 카테고리의 다른 글
[다이나믹 프로그래밍] 백준 실버1 1149번: RGB거리 (0) | 2023.09.07 |
---|---|
[완전 탐색] 백준 실버4 1018번: 체스판 다시 칠하기(Swift) (0) | 2023.07.13 |
[구현 + BFS] 백준 골드3 16236번: 아기 상어(Swift) (0) | 2023.06.22 |
[구현 + 재귀] 백준 골드5 14891번: 톱니바퀴(Swift) (0) | 2023.06.22 |
[백트래킹 + 구현] 백준 실버1 14888번: 연산자 끼워넣기(Swift) (0) | 2023.06.09 |