https://school.programmers.co.kr/learn/courses/30/lessons/87946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import Foundation
func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
var result = 0 //최대 던전수
//모든 경우의 수를 생각해봐야 하기 때문에 재귀 함수 사용
func visit(_ orders: [Int]){
//3. orders에 가야할 던전의 순서가 정해질 경우
if orders.count == dungeons.count{
var remainingFatigue = k //남은 피로도
var count = 0 // 진행한 던전개수
/*
4.남은 피로도가 던전의 최소피로도 이상일 경우
진행 던전개수를 늘리고 남은피로도를 줄이도록함
*/
for i in 0..<orders.count{
if remainingFatigue >= dungeons[orders[i]][0]{
count += 1
remainingFatigue -= dungeons[orders[i]][1]
}
}
//5.진행 가능한 던전이 최대일 경우 result 갱신
if count > result{
result = count
}
}
// 2.orders에 모든 경우의 수를 인덱스값으로 저장
for i in 0..<dungeons.count{
if !orders.contains(i){
visit(orders + [i])
}
}
}
// 1.처음 입장할 던전을 가지고 재귀함수 실행
for i in 0..<dungeons.count{
visit([i])
}
return result
}
* 재귀 함수 확인 코드*
import Foundation
func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
var result = 0
func visit(_ orders: [Int]){
print("처음orders",orders)
if orders.count == dungeons.count{
var remainingFatigue = k //남은 피로도
var count = 0 // 진행한 던전개수
for i in 0..<orders.count{
if remainingFatigue >= dungeons[orders[i]][0]{
count += 1
print("사용전 피로도:\(remainingFatigue)")
remainingFatigue -= dungeons[orders[i]][1]
print("사용후 피로도:\(remainingFatigue)")
}
}
if count > result{
result = count
}
}
for i in 0..<dungeons.count{
if !orders.contains(i){
print("i:\(i)")
print("orders: \(orders)")
visit(orders + [i])
}
}
print("끝")
print("전에 호출해서 부른 visit: \(orders)")
}
for i in 0..<dungeons.count{
print(i)
visit([i])
}
return result
}
solution(80, [[80,20],[50,40],[30,10]])
/*
Debug area에 출력된 결과
0
처음orders [0]
i:1
orders: [0]
처음orders [0, 1]
i:2
orders: [0, 1]
처음orders [0, 1, 2]
사용전 피로도:80
사용후 피로도:60
사용전 피로도:60
사용후 피로도:20
끝
전에 호출해서 부른 visit: [0, 1, 2]
끝
전에 호출해서 부른 visit: [0, 1]
i:2
orders: [0]
처음orders [0, 2]
i:1
orders: [0, 2]
처음orders [0, 2, 1]
사용전 피로도:80
사용후 피로도:60
사용전 피로도:60
사용후 피로도:50
사용전 피로도:50
사용후 피로도:10
끝
전에 호출해서 부른 visit: [0, 2, 1]
끝
전에 호출해서 부른 visit: [0, 2]
끝
전에 호출해서 부른 visit: [0]
1
처음orders [1]
i:0
orders: [1]
처음orders [1, 0]
i:2
orders: [1, 0]
처음orders [1, 0, 2]
사용전 피로도:80
사용후 피로도:40
사용전 피로도:40
사용후 피로도:30
끝
전에 호출해서 부른 visit: [1, 0, 2]
끝
전에 호출해서 부른 visit: [1, 0]
i:2
orders: [1]
처음orders [1, 2]
i:0
orders: [1, 2]
처음orders [1, 2, 0]
사용전 피로도:80
사용후 피로도:40
사용전 피로도:40
사용후 피로도:30
끝
전에 호출해서 부른 visit: [1, 2, 0]
끝
전에 호출해서 부른 visit: [1, 2]
끝
전에 호출해서 부른 visit: [1]
2
처음orders [2]
i:0
orders: [2]
처음orders [2, 0]
i:1
orders: [2, 0]
처음orders [2, 0, 1]
사용전 피로도:80
사용후 피로도:70
사용전 피로도:70
사용후 피로도:30
끝
전에 호출해서 부른 visit: [2, 0, 1]
끝
전에 호출해서 부른 visit: [2, 0]
i:1
orders: [2]
처음orders [2, 1]
i:0
orders: [2, 1]
처음orders [2, 1, 0]
사용전 피로도:80
사용후 피로도:70
사용전 피로도:70
사용후 피로도:30
끝
전에 호출해서 부른 visit: [2, 1, 0]
끝
전에 호출해서 부른 visit: [2, 1]
끝
전에 호출해서 부른 visit: [2]
*/
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] 최댓값과 최솟값 (Swift) (0) | 2023.07.24 |
---|---|
[프로그래머스] 타겟넘버 (Swift) ※1,2번 실행초과 (0) | 2023.07.12 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT[3차] 압축 (Swift) (0) | 2023.06.26 |
[프로그래머스] 2개 이하로 다른 비트 (Swift) -10,11 실행초과 (0) | 2023.06.18 |
[프로그래머스] 덧칠하기 (Swift) (3) | 2023.06.07 |