[백트래킹 + 구현] 백준 실버1 14888번: 연산자 끼워넣기(Swift)

2023. 6. 9. 18:02·코테

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

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱

www.acmicpc.net

문제풀이

해당 문제는 주어진 수와 연산자를 조합하여 최솟값과 최댓값을 구하는 문제이다.

최솟값과 최댓값을 구해야하므로 백트래킹 기법을 사용하여 모든 경우의 수를 탐색해야 한다.

let n = Int(readLine()!)!
var numArr: [Int] = readLine()!.split(separator: " ").map { Int($0)! }
var visited: [Int] = readLine()!.split(separator: " ").map { Int($0)! }
var resultMax = Int.min
var resultMin = Int.max

func dfs(_ count: Int, _ value: Int) {
  if count == n {
    resultMax = max(value, resultMax)
    resultMin = min(value, resultMin)
    return
  }
  
  for i in 0..<4 {
    if visited[i] != 0 {
      visited[i] -= 1
      var value = value
      if i == 0 {
        value += numArr[count]
      } else if i == 1 {
        value -= numArr[count]
      } else if i == 2 {
        value *= numArr[count]
      } else if i == 3 {
        value /= numArr[count]
      }
      dfs(count + 1, value)
      visited[i] += 1
    }
  }
}

dfs(1, numArr[0])
print(resultMax)
print(resultMin)

백트래킹 기법을 사용하기 위해 visited 배열을 통해 연산자의 개수를 카운팅 해준다.

또한, dfs 메서드를 구현하여 제귀를 활용해 모든 경우의 수를 탐색하면 된다.

파라미터로 어디까지 연산했는지 카운팅하고, value를 통해 지금까지 연산 값을 저장한다.

사용한 연산자는 visited 배열에서 하나 빼주고 다음 제귀를 통해 다음 연산을 진행한다.

모든 수의 연산이 끝났으면 값을 각 변수에 저장하고 제귀 함수를 끝낸다.

제귀함수가 끝나면 다음 경우의 수도 계산할 수 있게 visited를 원 상대로 복귀시킨다.

저작자표시 (새창열림)

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

[구현 + BFS] 백준 골드3 16236번: 아기 상어(Swift)  (0) 2023.06.22
[구현 + 재귀] 백준 골드5 14891번: 톱니바퀴(Swift)  (0) 2023.06.22
[백트래킹 + 구현] 백준 실버2 14889번 스타트와 링크(Swift)  (0) 2023.06.09
[다이나믹 프로그래밍 + 그리디] 백준 실버5 14916번: 거스름돈(Swift)  (0) 2023.05.29
[해시] 백준 실버4 10816번: 숫자 카드2(Swift)  (0) 2023.05.29
'코테' 카테고리의 다른 글
  • [구현 + BFS] 백준 골드3 16236번: 아기 상어(Swift)
  • [구현 + 재귀] 백준 골드5 14891번: 톱니바퀴(Swift)
  • [백트래킹 + 구현] 백준 실버2 14889번 스타트와 링크(Swift)
  • [다이나믹 프로그래밍 + 그리디] 백준 실버5 14916번: 거스름돈(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[백트래킹 + 구현] 백준 실버1 14888번: 연산자 끼워넣기(Swift)
상단으로

티스토리툴바