3477. Fruits Into Baskets II
Contest 440번의 1번 문제다.
문제 설명
- 두가지 정수 배열이 주어지고, 각 배열의 길이 n
- 과일을 선택해서 baskets배열에 맞게 넣어주면된다.
- 이때는 과일갯수보다 큰 바구니면서, 가장 왼쪽에 있는애를 담아주면된다.
문제 풀이
class Solution {
func numOfUnplacedFruits(_ fruits: [Int], _ baskets: [Int]) -> Int {
var basket_visited = Array(repeating: false, count: baskets.count)
var cnt = 0
for fruit in fruits {
var isFound = false
for (idx, plate) in baskets.enumerated() {
if plate >= fruit && !basket_visited[idx] {
basket_visited[idx] = true
isFound = true
break
}
}
if !isFound {
cnt += 1
}
}
return cnt
}
}
basket
표시 위한 visited
배열정도가 좀 특이한점? 이고 끝가지 못찾았을때 카운팅을 해줘야하기때문에이걸 isFound
라는 변수로서 처리를 해줬다.최종 제출 코드
class Solution {
func numOfUnplacedFruits(_ fruits: [Int], _ baskets: [Int]) -> Int {
var basket_visited = Array(repeating: false, count: baskets.count)
var cnt = 0
for fruit in fruits {
var isFound = false
for (idx, plate) in baskets.enumerated() {
if plate >= fruit && !basket_visited[idx] {
basket_visited[idx] = true
isFound = true
break
}
}
if !isFound {
cnt += 1
}
}
return cnt
}
}
타인의 코드
class Solution {
func numOfUnplacedFruits(_ fruits: [Int], _ baskets: [Int]) -> Int {
var b = baskets
var r = 0
for f in fruits {
guard let i = b.firstIndex(where: { $0 >= f }) else {
r += 1
continue
}
b.remove(at: i)
}
return r
}
}
guard let
을 활용해 firstIndex
로 조건을 만족하는 바구니를 찾고, where
로 필터링해서 바구니가 없으면 카운팅하는 방식visited
로 체크한 것과 달리, 상대방은 바구니를 아예 remove
로 제거한 것을 볼 수 있다. firstIndex
나 remove
는 항상 전체 배열을 대상으로 하니까, 앞에서부터 순차적으로 찾는 방식 정도가 차이인 것 같다. isFound
변수를 억지로 만들어서 예외를 처리한 게 좀 마음에 안 들었는데, 다음부터는 guard let
활용해서 예외 처리해주면 될 것 같다.101일정도 진행하면서, 이제 Apple Developer Academy @Postech 합격생에서 러너가되어 2주를 보내고, Challenge1을 하고 있는 중인데, 챌린지가 생각보다 시간을 많이 잡아먹는바람에, 챌린지 참여 이후 알고리즘을 풀면 거의 하루가 다 가버리는 참사가 발생했기에..
정작 나의 현주소는 Swift로 앱개발을 진행하는게 불가능한 수준인데, 계속해서 알고리즘을 매일 풀면서 그 부분을 메우기에는 아직 부족한 것 같아서, 이제는 SwiftUI개발에 좀 더 비중을 두어야겠다고 생각했고, 알고리즘은 스터디를 통해서 이틀에 한번? 정도 주어진 문제를 풀면서 나아갈 것 같다. 블로그는 TIL이나 WIL느낌으로 Swift로 앱개발을 진행하면서 생긴 궁금점들 같은거를 묶어서 내보는 방식이 될 것 같다.