😎풀이

백트레킹 문제이다.

IP 주소의 기본 구성을 잘 모른다 하더라도 친절히 적합한 IP 주소의 요건을 문제에서 제시하기에 큰 어려움 없이 풀이가 가능하다

function restoreIpAddresses(s: string): string[] {
    // 4자 미만이거나 12자를 초과하는 경우 생성 불가
    const len = s.length;
    if(len < 4 || len > 12) return [];

    const result = []

    // 백트레킹
    // start: ip 시작 인덱스
    // dots: 현재 포함된 '.' 수
    // currentIP: 현재까지 만들어진 ip주소
    function backTracking(start: number, dots: number, currentIP: string): void {
        // IP 주소가 완성되는 단계라면
        if(dots === 3) {
            // 남은 문자열 다 확보
            const curStr = s.slice(start);
            if(!isValidIP(curStr)) return;
            const ip = currentIP + curStr;

            result.push(ip);
            return;
        }

        // 문자열 최대길이 내에서 순회
        for(let i = 1; i <= 3 && (start + i) <= 12; i++) {
            // 현재 문자열 + '.'
            const curStr = s.slice(start, start + i);
            if(!isValidIP(curStr)) continue;
            backTracking(start + i, dots + 1, currentIP + curStr + '.')
        }
    }

    // IP에 적합한지 판단하는 함수
    function isValidIP(ip: string): boolean {
        // 빈 문자열 안됨
        if(ip.length === 0) return false;
        // 0으로 시작하면 안됨
        if(ip.length > 1 && ip[0] === '0') return false;
        // 숫자 범위는 0과 255 사이에 위치해야함
        const intIP = Number(ip)
        if(intIP < 0 || intIP > 255) return false;

        return true;
    }

    backTracking(0, 0, '')
    return result
};
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글