숫자 게임
문제 설명
- 사진처럼 숫자 하나씩 내기 게임진행
- A팀 패가 유출돼서 그것에 맞게 가장 B팀이 승점을 많이 챙긴다면 몇점인지 return
문제 풀이
- A팀 패가 노출된 상황에서 B가 그에 맞게 수행하는거니까 A의 배열도 맘대로 바꿀 수 있구나 정도를 캐치할 수 있었다.
- 처음에는 그냥 각각 내림차순, 오름차순으로 정렬해서 맞붙게하면 대강나올 거라고 생각했다....
import Foundation
func solution(_ a: [Int], _ b: [Int]) -> Int {
let a = a.sorted(by: <)
let b = b.sorted(by: <)
var answer = 0
for i in zip(a, b) {
if i.0 < i.1 { // B팀 win
answer += 1
}
}
return answer
}
removeLast()
를 통해서 빼주면서 체킹하려고 이렇게 설계를 해줬다. var a = a.sorted(by: >)
let b = b.sorted(by: <)
// A팀 min > B팀 max
guard a[a.count-1] < b[b.count-1] else {
return 0
}
B가 질것같으면 슬쩍 pointer+=1
를 통해서 다음패로 바꿔주는 것이다. 해당 문제에서 질때는 감점이 없어서, 넘어간 친구는 자연스레 버리는 카드라고 생각하면 된다.
while !a.isEmpty, pointer < b.count {
let target = a.removeLast()
while pointer < b.count, b[pointer] < target {
pointer += 1
}
if b[pointer] > target {
answer += 1
}
pointer += 1
}
import Foundation
func solution(_ a: [Int], _ b: [Int]) -> Int {
var a = a.sorted(by: >)
let b = b.sorted(by: <)
// A팀 min > B팀 max => 0
guard a[a.count-1] < b[b.count-1] else {
return 0
}
var answer = 0
var pointer = 0
while !a.isEmpty, pointer < b.count {
let target = a.removeLast()
while pointer < b.count, b[pointer] < target {
// A팀 min > B팀 max => 0
pointer += 1
}
if b[pointer] > target {
answer += 1
pointer += 1
}
}
return answer
}
이렇게 끝날줄알았는데.. 17번 테스트 케이스 통과를 못해서 반례찾고 디버깅을 하느라 좀 걸린 것 같다.
문제도 많이 푼 문제가 아니라 , 질문 게시판에서 반례얘기가 잘없어서 내가 그냥 임의로 ```css A : [1,1,1,1] B : [1,1,1,2]
정답 : 1 (2하나가 1을 이기는 구조)
내 코드 : 0
왜 0 이 나온거지 하다보니 이 부분에서 이게 같을때는 Pointer가 이동을 안하더라!
```swift
if b[pointer] > target {
answer += 1
pointer += 1
}
-> 밖으로 빼줘서 딱히 성과없어도 넘어가도록 했다.
if b[pointer] > target {
answer += 1
}
pointer += 1
그래도 여전히 17번 틀리는 사태에 대해서는 이번에
A : [1,1,1,2]
B : [1,1,1,2]
정답 : 1
내 코드 : 0
이렇게 해줬더니 여전히 문제가 있었다. (운이 좋게 기가막히게 바로 반례들이 찾아졌다.)
while pointer < b.count, b[pointer] < target {
pointer += 1
}
while pointer < b.count, b[pointer] < target
부등호를 같을때도 넘어가게했었어야했는데, 이걸 빼먹었는데도 17번빼고 다맞은게 오히려 신기했다. 이부분 수정하니까
채점 결과
정확성: 85.7
효율성: 14.3
합계: 100.0 / 100.0
드디어 정답이 떴다 ! 😇
최종 제출 코드
import Foundation
func solution(_ a: [Int], _ b: [Int]) -> Int {
var a = a.sorted(by: >)
let b = b.sorted(by: <)
// A팀 min > B팀 max => 0
guard a[a.count-1] < b[b.count-1] else {
return 0
}
var answer = 0
var pointer = 0
while !a.isEmpty, pointer < b.count {
let target = a.removeLast()
while pointer < b.count, b[pointer] <= target {
// A팀 min > B팀 max => 0
pointer += 1
}
if b[pointer] > target {
answer += 1
}
pointer += 1
}
return answer
}
타인의 코드
import Foundation
func solution(_ a:[Int], _ b:[Int]) -> Int {
let sA = a.sorted()
let sB = b.sorted()
var index = 0
for e in sB {
if e > sA[index] {
index += 1
}
}
return index
}
온몸비틀기로 겨우 풀었는데, 훨씬 간결한 코드가 있네..
시간 복잡도를 조금이라도 줄이려고 스택에 pop해주면서 풀은건데, 좀 유난이었던 것 같고,, 기분에 충실하자는 생각을 다시 한 번 하게 됐다.
나는 A의 원소를 기준으로 접근했지만, B의 원소를 기준으로 하나씩 비교하니 굳이while
문이나removeLast()
를 쓰지 않아도 깔끔하게 해결됐다.