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

2023. 7. 8. 16:16·코테

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)
저작자표시 (새창열림)

'코테' 카테고리의 다른 글

[다이나믹 프로그래밍] 백준 실버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
'코테' 카테고리의 다른 글
  • [다이나믹 프로그래밍] 백준 실버1 1149번: RGB거리
  • [완전 탐색] 백준 실버4 1018번: 체스판 다시 칠하기(Swift)
  • [구현 + BFS] 백준 골드3 16236번: 아기 상어(Swift)
  • [구현 + 재귀] 백준 골드5 14891번: 톱니바퀴(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    그리디
    동시성
    구현
    브루트포스 알고리즘
    노드
    ios
    이분탐색
    완전탐색
    백준
    PhotoKit
    다이나믹 프로그래밍
    코테
    알고리즘
    Property wrapper
    photoUI
    GCD
    dfs
    네부캠
    탐색
    Race Condition
    Combine
    비동기
    photos
    BFS
    챌린지
    회고
    재귀
    코딩테스트
    Swift
    실버
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[구현] 백준 실버3 2503번: 숫자 야구(Swift)
상단으로

티스토리툴바