반응형
문제
https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
풀이
백트래킹 알고리즘을 사용해서 풀 수 있는 문제입니다.
수 사이에 연산자를 하나씩 다 넣어보고, 최대값과 최소값을 구할 수 있습니다.
연산자의 갯수를 Int 자료형의 Array로 입력을 주기 때문에,
이 Array의 Index를 사용해 어떤 연산자인지 판별하였습니다.
코드를 직접 보시면 쉽게 이해가 될 것입니다.
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let n = Int(readLine()!)! | |
let nums = readLine()!.split(separator: " ").map { Int($0)! } | |
var opersCount = readLine()!.split(separator: " ").map { Int($0)! } | |
var maxValue = Int.min | |
var minValue = Int.max | |
func dfs(answer: Int, d: Int) { | |
if d == n { | |
maxValue = max(maxValue, answer) | |
minValue = min(minValue, answer) | |
return | |
} | |
for i in 0..<4 { | |
if opersCount[i] < 1 { | |
continue | |
} | |
opersCount[i] -= 1 | |
switch i { | |
case 0: | |
dfs(answer: answer + nums[d], d: d + 1) | |
case 1: | |
dfs(answer: answer - nums[d], d: d + 1) | |
case 2: | |
dfs(answer: answer * nums[d], d: d + 1) | |
case 3: | |
dfs(answer: answer / nums[d], d: d + 1) | |
default: | |
break | |
} | |
opersCount[i] += 1 | |
} | |
} | |
dfs(answer: nums[0], d: 1) | |
print(maxValue) | |
print(minValue) |
후기
생각보다는 어려웠던 문제였습니다.
백트래킹 알고리즘은 금방 떠올렸는데, 구현하는데 시간이 조금 걸렸던 문제였습니다.
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 1449 수리공 항승 (Swift) (0) | 2023.04.05 |
---|---|
[BOJ] 백준 14889 스타트와 링크 (Swift) (0) | 2023.04.05 |
[BOJ] 백준 2580 스도쿠 (Swift) (0) | 2023.04.05 |
[BOJ] 백준 9963 N-Queen (Swift) (0) | 2023.04.04 |
[BOJ] 백준 15652 N과 M (4) (Swift) (0) | 2023.04.04 |