ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1437. Check If All 1's Are at Least Length K Places Away
    Programming/leetcode 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

     

    'Programming > leetcode' 카테고리의 다른 글

    1680. Concatenation of Consecutive Binary Numbers  (0) 2021.01.28
    23. Merge k Sorted Lists  (0) 2021.01.26
    5. Longest Palindromic Substring  (0) 2021.01.25
    49. Group Anagrams  (0) 2021.01.21
    819. Most Common Word  (0) 2021.01.21
Designed by Tistory.