Programming/leetcode

1437. Check If All 1's Are at Least Length K Places Away

홍열 2021. 1. 26. 08:37
728x90

1월 26일 오늘의 문제 

 

0과 1로 구성되는 배열과 k가 주어지고, 배열 값이 1일때 k 범위안에 또 다른 1이 있으면 False, 끝까지 탐색했을 때는 True

 

n^2으로 풀 수 있는 문제 

앞에서부터 가면서 1을 만나면, 앞/뒤로 k범위 안에 1이 있는지 확인

    def kLengthApart(self, nums: [int], k: int) -> bool:
        for i, num in enumerate(nums):
            # 현재 값이 1이면 내 위치에서 i-k, i+k 안에 1이 들어 있었는지 확인
            if num == 1:
                for j in range(i-k, i):
                    if j<0:continue
                    if nums[j] == 1:
                        return False

                for j in range(i+1, i+k+1):
                    if j>=len(nums):break
                    if nums[j] == 1:
                        return False

        return True

 

01/26/2021 08:15 Accepted 592 ms 16.8 MB python3

 

좀 더 빠르게 풀 수 있는 방법이 있을까? 비트연산도 있다는데..이건 나중에 공부해보자

 

k를 이용하면 된다. 
즉, 1을 만나면 k범위 안에 1이 있는 지 판별한다는 것은 이전의 1과 다음 1 사이에 k만큼 0이 있으며 된다. 

만약 k가 2라면,  두번째 1을 만났을때 0의 갯수가 2개이다. 즉 k이므로 True가 된다.

1 0 0 1 0
    def kLengthApart(self, nums: [int], k: int) -> bool:
        # 1을 만나기전까지 0의 갯수를 세고, 1을 만나면 count와 k를 비교
        count = 0
        for num in nums:
            if num == 1:
                if count < k:
                    return False
                count = 0
            else:
                count += 1
        return True
01/26/2021 08:32 Accepted 540 ms 16.9 MB python3