https://www.acmicpc.net/problem/2503
문제 요약:
- 1~9까지의 서로 다른 숫자로 이루어진 3자리 숫자가 목표 수
- 입력으로는 3자리 숫자와 스트라이크, 볼의 개수가 주어짐
- 입력된 값을 토대로 정답이 될 수 있는 숫자의 개수를 묻는 문제
풀이 과정:
- 서로 다른 숫자로 이루어진 수만이 들어가므로 순열을 이용해서 서로 다른 숫자로 이루어진 3자리 가능한 숫자 배열을 구함.
- 입력을 받을때마다 가능한 숫자 배열을 반복문으로 돌면서 입력된 수와 가능한 숫자를 서로 비교하여 스트라이크와 볼의 개수를 구함.
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)
'Algorithm > 백준' 카테고리의 다른 글
Swift) 백준 1713번 후보 추천하기 - S1 (0) | 2023.11.21 |
---|---|
Swift) 백준 6603 로또 - S2 (0) | 2023.09.23 |
Swift) 백준 17503번 맥주 축제 - S1 (0) | 2023.07.09 |
Swift) 백준 2116번 주사위 쌓기 - G5 (0) | 2023.06.14 |
Swift) 백준 3190번 뱀 - G4 (0) | 2023.06.10 |