링크 : https://leetcode.com/problems/can-place-flowers/
description
You have a long flowerbed in which some of the plots are planted, and some are not. However, flowers cannot be planted in adjacent plots.
Given an integer array flowerbed containing 0’s and 1’s, where 0 means empty and 1 means not empty, and an integer n, return if n new flowers can be planted in the flowerbed without violating the no-adjacent-flowers rule.
Example:
Input: flowerbed = [1,0,0,0,1], n = 1
Output: true
Input: flowerbed = [1,0,0,0,1], n = 2
Output: false
Constraints
- 1 <= flowerbed.length <= 2 * 104
- flowerbed[i] is 0 or 1.
- There are no two adjacent flowers in flowerbed.
- 0 <= n <= flowerbed.length
풀이
이 문제는 로직이 어렵다기보다 뭔가 쓰면서 디벨롭하는 과정이 흥미로워서 정리하게 됐다.
초기 코드
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
available = 0
if len(flowerbed) == 1 :
return not flowerbed[0] or not n
for i in range(len(flowerbed)) :
if flowerbed[i] == 0:
if i == 0 :
if flowerbed[1] == 0 :
available += 1
flowerbed[0] = 1
elif i == len(flowerbed) - 1 :
if flowerbed[-2] == 0 :
available += 1
flowerbed[-1] = 1
elif flowerbed[i-1] == 0 and flowerbed[i+1] == 0 :
available += 1
flowerbed[i] = 1
if available >= n : return True
return False
개선한 코드
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
if n == 0 or len(flowerbed) == 1 :
return not n or not flowerbed[0]
for i in range(len(flowerbed)) :
left = (i == 0 or flowerbed[i-1] == 0)
right = (i == len(flowerbed) - 1 or flowerbed[i+1] == 0)
if flowerbed[i] == 0 and left and right :
n -= 1
flowerbed[i] = 1
if n == 0 : return True
return False
설명
로직은 같은데 조건문 개수가 확 줄면서 depth가 없어져 코드가 굉장히 가독성이 높아졌다. 기존에는 인덱스가 맨 앞인지, 맨 뒤인지 비교해주었다면 left, right 변수를 따로 두어서 사용성을 높이게끔 했다. 그리고 available
변수를 따로 사용하지 않고 n을 활용했다. 후자가 아주 마음에 든다…⚾️