-
백준 2629 양팔저울Algorithm/BOJ 2021. 4. 8. 18:29728x90
출처: www.acmicpc.net/problem/2629
분류: DP
접근방식
DFS 느낌으로 무게를 달 수 있는 경우들을 잘 세어야 하는 문제였습니다.
하나의 추를 놓고 3가지 경우를 생각해볼 수 있습니다.
1. 추를 추가하지 않았을 경우
2. 추를 구슬 반대쪽에 추가 ( weight + 추 )
3. 추를 구슬 쪽에 추가 ( |weight - 추| )문제는 기저사례를 체크하는 부분이었는데,
단순히 무게만으로 확인했는지 체크하면 안 됩니다. 추를 몇 개를 사용했는지에 따라서 다음 무게들이 달라질 수 있기 때문에
몇 개의 추를 사용해 만든 무게인지 구분해줘야 합니다.따라서 [현재 추][무게] 인 2차원 배열로 체크해줬네요!
추를 추가하지 않는 경우도 생각해줬기 때문에 마지막에 체크해줄 때는 추를 모두 사용했을 때의 배열 중에서 있는지만 확인해주면 됩니다 :)
마지막으로 추의 무게는 500g 에 최대 30개이기 때문에 무게를 확인할 수 있는 구슬은 최대 15000 까지 입니다. 따라서 15000이 넘는 구슬은 "N" 으로 처리해줍니다.
해결방법
let n = Int(readLine()!)! var scales = readLine()!.split(separator: " ").map { Int(String($0))! } let k = Int(readLine()!)! var marbles = readLine()!.split(separator: " ").map { Int(String($0))! } var check = [[Bool]](repeating: [Bool](repeating: false, count: 15005), count: scales.count+1) func addScale(_ idx: Int, _ weight: Int) { guard !check[idx][weight] else { return } check[idx][weight] = true guard idx < scales.count else { return } addScale(idx+1, weight + scales[idx]) addScale(idx+1, weight) addScale(idx+1, abs(weight - scales[idx])) } addScale(0, 0) print(marbles.map({ ($0 > 1500 || !check[scales.count][$0]) ? "N" : "Y" }).joined(separator: " "))
배운점
같은 무게여도 추의 개수에 따라서 달라질 수 있다는 점을 생각하지 못했다... 어려웠다..
후 check 배열을 15000으로 해야되는데 1500으로 해서 무지하게 틀려댔다... 하 도랐..... ☠️
'Algorithm > BOJ' 카테고리의 다른 글
백준 1238 파티 (0) 2021.04.19 백준 16920 확장 게임 (0) 2021.04.09 백준 11000 강의실 배정 (0) 2021.04.08 백준 2042 구간 합 구하기 (0) 2021.04.08 백준 16234 인구 이동 (0) 2021.04.08