Study/Algorithm

LeetCode (C/C++, Java) 93. Restore IP Addresses

hwooo 2024. 12. 3. 01:57

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


풀이

문자열을 앞에서부터 1~3자리로 나누면서 나뉜 값의 범위가 (0, 255)인지 확인 후, 주소 형태의 문자열로 만드는 과정을 반복한다.

주어진 문자열이 4개로 나뉘거나, 문자열을 다 사용했을 때의 조건을 확인해 답 배열에 추가해준다.


C/C++ 코드

class Solution {
public:
    vector<string> addresses;
    void getIP(string s, int cnt, string ip) {
        
        if (cnt == 4 || s.empty()) {
            // 4개로 나뉘어짐 && 주어진 문자열을 다 사용함
            if (cnt == 4 && s.empty())
                addresses.push_back(ip.substr(0, ip.size() - 1));
            else
                return;
        }

        // 현재 원소가 0이라면 무조건 1개만 사용 가능함
        if (s[0] == '0') {
            return getIP(s.substr(1), cnt + 1, ip + "0.");
        }
    
        // 1~3자리로 나눴을 때 수의 범위가 (0, 255)라면 삽입
        for (int i = 0; i < min(3, (int)s.size()); i++) {
            string sub = s.substr(0, i + 1);
            if (0 <= stoi(sub) && stoi(sub) <= 255)
                getIP(s.substr(i + 1), cnt + 1, ip + sub + ".");
        }
    }

    vector<string> restoreIpAddresses(string s) {
        getIP(s, 0, "");
        return addresses;
    }
};

 

Java 코드

class Solution {
    public List<String> answer = new ArrayList<>();

    public void getIPs(String s, StringBuilder ip, int cnt) {
        if (s.isEmpty() || cnt == 4) {
            if (s.isEmpty() && cnt == 4) {
                ip.setLength(ip.length() - 1);
                answer.add(ip.toString());
            }
            return;
        }

        if (s.charAt(0) == '0') {
            getIPs(s.substring(1), ip.append("0."), cnt + 1);
            return;
        }

        for (int i = 0; i < Math.min(3, s.length()); i++) {
            int subInt = Integer.parseInt(s.substring(0, i + 1));
            int len = ip.length();
            if (0 <= subInt && subInt <= 255) {
                getIPs(s.substring(i + 1), ip.append(subInt).append("."), cnt + 1);
                ip.setLength(len);
            }
        }
    }
    public List<String> restoreIpAddresses(String s) {
        getIPs(s, new StringBuilder(), 0);
        return answer;
    }
}