프로그래머스 LV1 - 카드뭉치(Swift)
2023. 3. 14. 20:43ㆍ알고리즘 문제
반응형
접근방식
- 큐를 이용하여 현재 가장 첫번째 원소가 현재
cards1
혹은cards2
에 위치하는지 확인 후 있을 경우goal
을 계속 확인 - 없을 경우, 곧바로
return
함 goal
의 모든 항목이cards1
과cards2
에 있는지 확인한다.
첫번째 정답
func haveWord(_ cards1:[String], _ cards2:[String], _ goal:[String]) -> Bool {
var result = false
goal.forEach { word in
if cards1.contains(word) || cards2.contains(word) {
result = true
} else {
result = false
return
}
}
return result
}
func solution(_ cards1:[String], _ cards2:[String], _ goal:[String]) -> String {
if haveWord(cards1, cards2, goal) == false {
return Result.failure.value
}
var cards1 = cards1
var cards2 = cards2
var result: Result = .success
goal.forEach { word in
if cards1.first == word {
cards1.removeFirst()
} else if cards2.first == word {
cards2.removeFirst()
} else {
result = .failure
return
}
}
return result.value
}
- 위 문제를 푼 이후 든 생각
- 굳이
haveWord
메소드를 할 필요가 없다. - 만약 없을 경우 큐의 첫번째 원소에서도 없을거기 때문에 굳이for
문이 여러번 도는 방식을 만들 필요가 없다. removeFirst
의 시간복잡도는 O(n)이므로LinkedList
를 통하여Queue
를 만들어줄 필요가 있을 것 같다.
- 굳이
두번째 정답
enum Result {
case success
case failure
var value: String {
switch self {
case .success:
return "Yes"
case .failure:
return "No"
}
}
}
class Node {
let value: String
var next: Node?
init(value: String, next: Node? = nil) {
self.value = value
self.next = next
}
}
struct LinkedList {
var head: Node?
var tail: Node?
var peek: String? {
return self.head?.value
}
init(data: [String]) {
data.forEach { word in
let node = Node(value: word)
if head == nil && tail == nil {
self.head = node
self.tail = node
} else {
self.tail?.next = node
self.tail = node
}
}
}
mutating func removeFirst() {
let firstNode = self.head
self.head = firstNode?.next
firstNode?.next = nil
}
}
func solution(_ cards1:[String], _ cards2:[String], _ goal:[String]) -> String {
var cards1 = LinkedList(data: cards1)
var cards2 = LinkedList(data: cards2)
var result: Result = .success
goal.forEach { word in
if cards1.peek == word {
cards1.removeFirst()
} else if cards2.peek == word {
cards2.removeFirst()
} else {
result = .failure
return
}
}
return result.value
}
LinkedList
를 통한Queue
구현 및haveWord
메소드를 없애므로써 시간이 이전 정답에 비해 확 줄어들었다.- 또한
Yes
와No
를 굳이String
값으로 가지고 있을 필요가 없기 때문에 열거형으로 구현하여Result
타입을 통해 값을 리턴해주었다.
반응형
'알고리즘 문제' 카테고리의 다른 글
프로그래머스 LV1 - 덧칠하기(Swift) (0) | 2023.03.21 |
---|---|
프로그래머스 LV1 - 바탕화면 정리(Swift) (0) | 2023.03.17 |
백준 17829 222-풀링(Swift) 재귀활용 (0) | 2023.01.19 |
백준 2346 - 풍선 터뜨리기(Swift) LinkedList로 구현 (0) | 2023.01.11 |
백준 1158 - 요세푸스 문제(Swift): LinkedList구현!! (0) | 2023.01.08 |