본문 바로가기
Algorithm/LeetCode

[LeetCode] 846. Hand of Straights (Swift, Python)

by 원만사 2022. 1. 9.
반응형

 

Hand of Straights - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

풀이

 먼저 입력으로 주어진 hand를 오름차순으로 정렬한다. 정렬된 hand에서 가장 앞에 있는(가장 작은) 카드를 손에 들고 현재 손에 있는 수에서 groupSize까지의 카드가 현재 배열에 존재하는지 체크한다. 예제에서는 처음에 손에 카드 1을 들고 2와 3이 있는지 체크한다. 2가 있다면 카운트를 하고 hand 배열에서 2를 제거한다. 다음으로 3이 있다면 카운트를 하고 hand 배열에서 제거한다. 하나의 그룹을 만들었으므로 손에 들고 있던 1 역시 hand 배열에서 제거하고 남은 카드들에 대해서 위의 과정을 반복한다.

 최종적으로 hand 배열 안에 카드가 남아있지 않다면 연속적으로 카드를 만들 수 있는 것이므로 true를 리턴해준다. Dictionary를 사용하긴 했는데 지금 보니 굳이 사용하지 않았어도 됐을 것 같다.

 

코드

[Swift]

class Solution {
    func isNStraightHand(_ hand: [Int], _ groupSize: Int) -> Bool {
        // hand에 있는 카드의 수가 groupSize의 배수가 아니면 false 리턴
        if hand.count % groupSize != 0 {
            return false
        }
        
        // 먼저 hand를 정렬해준다.
        var groupDict: [Int: Int] = [:]
        var sortHand: [Int] = hand.sorted()
        
        while !sortHand.isEmpty {
            let now: Int = sortHand[0] // 가장 작은 수의 카드를 손에 든다.
            groupDict[now] = groupSize - 1 // 해당 카드의 그룹을 만들기 위해서는 groupSize-1개의 카드가 필요하다.
            
            // for문을 통해서 now+1 부터 groupSize-1개 만큼의 카드가 있는지 체크한다.
            for i in 1..<groupSize {
                let next: Int = now + i
                
                // 만약 다음 카드가 hand에 없다면 false를 리턴해 종료한다.
                if !sortHand.contains(next) {
                    return false
                }
                
                // 다음 카드가 있다면 체크하고 hand에서는 제거해준다.
                groupDict[now]! -= 1
                guard let idx = sortHand.firstIndex(of: next) else { return false }
                sortHand.remove(at: idx)
            }
            
            // 하나의 그룹을 완성했으므로 now 카드도 제거해준다.
            sortHand.remove(at: 0)
        }
        
        return true
    }
}

[Python]

from collections import defaultdict

class Solution(object):

    def isNStraightHand(self, hand, groupSize):
        # hand에 있는 카드의 수가 groupSize의 배수가 아니면 false 리턴 
        if len(hand) % groupSize != 0:
            return False 
        
        # 먼저 hand를 정렬해준다. 
        groupDict = defaultdict(int)
        hand.sort()

        while hand:
            now = hand[0] # 가장 작은 수의 카드를 손에 든다.
            groupDict[now] = groupSize - 1 # 해당 카드의 그룹을 만들기 위해서는 groupSize-1개의 카드가 필요하다.
            
            # for문을 통해서 now+1 부터 groupSize-1개 만큼의 카드가 있는지 체크한다. 
            for i in range(1, groupSize):
                next = now + i 

                # 만약 다음 카드가 hand에 없다면 false를 리턴해 종료한다.
                if next not in hand:
                    return False 
                
                # 다음 카드가 있다면 체크하고 hand에서는 제거해준다. 
                groupDict[now] -= 1
                hand.remove(next)
            
            # 하나의 그룹을 완성했으므로 now 카드도 제거해준다.
            hand.remove(now)
        
        return True
반응형

댓글