[프로그래머스.숫자게임] Streak Day 93 🔥

·2025년 3월 12일
0

SwiftAlgorithm

목록 보기
98/105
post-thumbnail

숫자 게임


문제 설명

  1. 사진처럼 숫자 하나씩 내기 게임진행
  2. A팀 패가 유출돼서 그것에 맞게 가장 B팀이 승점을 많이 챙긴다면 몇점인지 return

문제 풀이

  1. A팀 패가 노출된 상황에서 B가 그에 맞게 수행하는거니까 A의 배열도 맘대로 바꿀 수 있구나 정도를 캐치할 수 있었다.
  2. 처음에는 그냥 각각 내림차순, 오름차순으로 정렬해서 맞붙게하면 대강나올 거라고 생각했다....

그 멍청한 생각에 따른 초기코드

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
}

🚫한 4개맞고 OUT🤔

3. 그 이후에 이제 생각을 바꿔서 일단 작은친구부터 이겨나가야한다고 생각을 해서 아래서부터 하나씩 맞붙는데, B팀에서 질때마다 index를 하나씩 올려주는 방식으로 수행했다.

일단 정렬하고 A가 내림차순인 이유는 스택으로 만들어서 removeLast()를 통해서 빼주면서 체킹하려고 이렇게 설계를 해줬다.

    var a = a.sorted(by: >)
    let b = b.sorted(by: <)

예외처리 - A팀의 최약체에게 B가 지면 바로 return 0

// A팀 min > B팀 max 
	guard a[a.count-1] < b[b.count-1] else {
        return 0
    }

B가 이기게해주는 핵심로직

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()를 쓰지 않아도 깔끔하게 해결됐다.

profile
기억보단 기록을

0개의 댓글