알고리즘/LeetCode

[LeetCode] 93. Restore IP Addresses - 깊이우선탐색(DFS) + 구현(Implementation) JAVA

passionfruit200 2025. 2. 16. 12:35

https://leetcode.com/problems/restore-ip-addresses/description/

코드설명

깊이우선탐색(DFS) + 구현(Implementation)을 활용합니다.

 

문제에 주어진대로 구현하면됩니다.

유의할점은 '.' 가 추가 됨에 따라 마지막에 '.'의 개수 4개가 추가되고, 마지막 점은 제거해주어야 하므로 1을 제거한다는 점까지 유의합니다.

또한, '.' 은 반드시 총 4번 더해지므로 (3번같지만, 코드에서는 마지막 점을 제거하기에 로직상 4번) level은 총 4번이면서, start == s.length() 일때 정답에 추가해줍니다.

 

IP Address가 유효한지 체크하는 부분은,

길이가 2 이상이면서, 만약 첫번째 숫자가 '0'이라면 leadingZero인 것이므로 유효하지 않음을 알 수 있습니다.

또한, 숫자범위 0~255 의 경우 처음에 잘못하고 아래와 같이 잘못 코딩했습니다.

if(num < 0 && num > 255) return true;

OR (||) 조건이어야 하겠지요.

아래와 같습니다.

if(num < 0 || num > 255) return true;

 

구현에 실수가 없어야하는 문제입니다.

 

또한, String ret을 통해서 매번 힙 구간에 새로운 문자열 객체(String은 immutable이기에 값에 더해진다고 하면, 새로운 객체가 생성됨)가 계속 생성되므로 유의합니다. 이 문제에서는 문제없습니다.

 

더 최적화 하고 싶다면, StringBuilder를 활용하면 됩니다.

코드

정답코드1입니다.

class Solution {
    ArrayList<String> answer = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        dfs(0, 0, s, new String(""));
        return answer;
    }
    
    public void dfs(int level, int start, String s, String ret){
        if(level == 4 && start == s.length()){
            answer.add(ret.substring(0, s.length() + 4 - 1));
            return ;
        }
        
        if(start + 3 <= s.length()){
            String str1 = s.substring(start, start + 3);
            if(isLeadingZeroOrOutofBounds(str1) == false){
               dfs(level + 1, start + 3, s,  ret + str1 + ".");
            }
        }
        if(start + 2 <= s.length()) {
            String str2 = s.substring(start, start + 2);
            if(isLeadingZeroOrOutofBounds(str2) == false){
                dfs(level + 1, start + 2, s, ret + str2 + ".");
            }
        }

        if(start + 1 <= s.length()){
            String str3 = s.substring(start, start + 1);
            if(isLeadingZeroOrOutofBounds(str3) == false){
                dfs(level + 1, start + 1, s, ret + str3 + ".");
            }
        }
    }

    public boolean isLeadingZeroOrOutofBounds(String s){
        if( s.length() >= 2 && s.charAt(0) == '0') return true;
        int num = Integer.parseInt(s);
        if(num < 0 || num > 255) return true;
        return false;
    }

}