알고리즘 문제 풀이: 자바/LeetCode

605. Can Place Flowers

hueco 2025. 11. 5.

 

📌 문제 링크 :

https://leetcode.com/problems/can-place-flowers

 

내 풀이(Success) :

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int L = flowerbed.length;
        for (int i = 0; i < L; i++) {
            if (flowerbed[i] == 0) {
                if (i == 0) {
                    if (L == 1) {
                        flowerbed[i] = 1;
                        n--;
                    } else if (flowerbed[i+1] == 0) {
                        flowerbed[i] = 1;
                        n--;
                    }
                }
                if (i > 0 && i < L-1) {
                    if (flowerbed[i-1] == 0 && flowerbed[i+1] == 0) {
                        flowerbed[i] = 1;
                        n--;
                    }
                }
                if (i == L-1) {
                    if (L > 1 && flowerbed[i-1] == 0) {
                        flowerbed[i] = 1;
                        n--;
                    }
                }
            }
            
            if (n <= 0) {
                return true;
            }
        }
        return false;
    }
}

 

🔨 리팩토링 :

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int L = flowerbed.length;
        for (int i = 0; i < L && n > 0; i++) {
            if (flowerbed[i] == 0) {
                boolean leftEmpty  = (i == 0)       || flowerbed[i - 1] == 0;
                boolean rightEmpty = (i == L - 1)   || flowerbed[i + 1] == 0;

                if (leftEmpty && rightEmpty) {
                    flowerbed[i] = 1;
                    n--;
                }
            }
        }
        return n <= 0;
    }
}

 

 

🧐 리뷰 :

이번 문제를 풀면서 느낀 점은, if문과 꽃을 심는 로직, 그리고 꽃의 개수를 감소시키는 코드가 여러 곳에서 반복된다는 것이었다.

처음엔 조건마다 세분화해서 처리했지만, 그 결과 코드가 불필요하게 복잡해지고 가독성도 떨어졌다.

 

문제를 푼 뒤, 내가 작성한 코드를 GPT에게 중첩된 if문을 제거하는 방향으로 리팩토링해달라고 요청했다.

리팩토링된 코드는 for 반복문에 (n > 0) 조건을 추가하여, 더 이상 꽃을 심을 필요가 없을 때는 반복을 중단하고 바로 결과를 반환하도록 개선되어 있었다.

또한 두 개의 boolean 변수를 사용해, 현재 위치의 양쪽이 비어 있는지를 단순하고 명확하게 비교하도록 변경된 점이 특히 인상적이었다.

 

이번 리팩토링을 통해 “조건 분기를 줄이면서도 로직의 의도를 명확히 드러내는 코드 구조”의 중요성을 다시 한 번 느꼈다.

앞으로는 일단 빠르게 문제를 해결하는 것을 목표로 하고, 이후에 중복된 조건이나 로직을 합칠 수 있는지, 그리고 가독성을 유지하면서 코드를 단순화할 수 있는지를 의식적으로 점검해봐야겠다.

 

'알고리즘 문제 풀이: 자바 > LeetCode' 카테고리의 다른 글

735. Asteroid Collision  (0) 2025.11.08
238. Product of Array Except Self  (0) 2025.11.06
345. Reverse Vowels of a String  (0) 2025.11.04
151. Reverse Words in a String  (0) 2025.11.03
1207. Unique Number of Occurrences  (0) 2025.11.02

댓글