[Java] 백준 26902번 - IP-adresser

2024. 4. 23. 16:39·백준

문제 링크 : https://www.acmicpc.net/problem/26902

 

▼ 문제 번역 ▼

더보기

문제
IPv4 주소는 마침표로 구분된 0에서 255 사이의 정수 4개(각각 앞에 0이 있어서는 안 됨)로 구성됩니다. 예를 들어. 1.0.3.255는 유효한 주소이고, 1.0.03.255, 1.0.3.256 및 1.0.3은 유효한 주소가 아닙니다. 일련의 숫자가 주어지면 해당 숫자에 마침표 3개를 삽입하여 생성할 수 있는 유효한 IPv4 주소를 모두 찾으세요.

입력
첫 번째 줄에는 최소 4자리, 최대 12자리의 ​​문자열이 포함됩니다.

출력
정수를 인쇄하세요: 점 3개를 삽입하여 형성할 수 있는 유효한 IP 주소의 수입니다.

===================================================================

 

0~255 숫자가 4개로 이루어진 IPv4 주소를 만들 수 있는 경우의 수를 구하는 문제이다.

 

숫자가 그렇듯이 0이 될 수는 있지만 0으로 시작하는 04, 004, 044 등이 불가능함에 유의해야한다. (String을 잘라야 하기 때문에 저런 숫자들이 만들어 질 수 있음)

 

입력은 일련 4~12자리의 숫자가 들어오며, 여기에 마침표 3개를 삽입해야 한다.

1~3자리의 숫자들이 있으면 될 것이고, dfs를 이용하여 자리수의 배열을 구해주었다.

 

예를 들어 291841 라는 입력이 들어올 경우, 6자리 이므로

1, 1, 2, 2

1, 1, 3, 1

1, 2, 1, 2

1, 2, 2, 1

2, 1, 1, 2

2, 1, 2, 1

2, 2, 1 ,1 자리로 배분할 수 있을것이다.

 

이를 입력에 맞게 배분해보면 아래와 같은 IP주소들이 만들어진다.

  1. 2.9.18.41
  2. 2.9.184.1
  3. 2.91.8.41
  4. 2.91.84.1
  5. 29.1.8.41
  6. 29.1.84.1
  7. 29.18.4.1

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    static String address;
    static int count;

    static void input(String[] lines) {
        address = lines[0];
        count = 0;
    }

    static String process() {
        dfs(new int[4], 0);
        return String.valueOf(count);
    }

    static void dfs(int[] list, int depth) {
        if (depth == 4) {
            int sum = 0;
            for (int i : list) {
                sum += i;
            }
            if (sum == address.length() && isValid(list)) {
                count++;
            }
            return;
        }

        for (int i = 1; i <= 3; i++) {
            list[depth] = i;
            dfs(list, depth + 1);
        }
    }

    private static boolean isValid(int[] list) {
        int idx = 0;
        for (int i : list) {
            String s = address.substring(idx, idx + i);
            if (s.length() == 2 && s.startsWith("0") ||
                s.length() == 3 && s.startsWith("00")) return false;
            int intS = Integer.parseInt(s);
            if (intS > 255) {
                return false;
            }
            idx += i;
        }
        return true;
    }

    public static void main(String[] args) throws IOException {
        input(readLines());
        System.out.println(process());
    }

    private static String[] readLines() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        List<String> lines = new ArrayList<>();
        String line;
        while ((line = br.readLine()) != null && !line.isEmpty()) {
            lines.add(line);
        }
        br.close();

        String[] linesArray = new String[lines.size()];
        linesArray = lines.toArray(linesArray);
        return linesArray;
    }
}

'백준' 카테고리의 다른 글

백준 1793번 타일링 : JAVA  (1) 2024.09.28
[Java] 백준 2133번 타일 채우기 - 그림 설명! 이해가 된다고 자부  (0) 2024.05.19
(DFS기본틀) [Java] 백준 15654번 - N과 M (5)  (0) 2024.04.23
[Java] 백준 14500번 - 테트로미노  (0) 2024.04.23
[Java] 백준 1107번 - 리모컨  (0) 2024.04.23
'백준' 카테고리의 다른 글
  • 백준 1793번 타일링 : JAVA
  • [Java] 백준 2133번 타일 채우기 - 그림 설명! 이해가 된다고 자부
  • (DFS기본틀) [Java] 백준 15654번 - N과 M (5)
  • [Java] 백준 14500번 - 테트로미노
효재감자
효재감자
  • 효재감자
    효재감자의 우당탕탕 개발일지
    효재감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • 아무거나 (3)
      • 백준 (44)
      • 알고리즘 (4)
      • 자바 (1)
      • 리눅스(우분투) 및 클라우드 (2)
      • 스프링 (14)
        • 스프링 시큐리티 인 액션 (도서 정리) (5)
      • 플러터(Dart) (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
효재감자
[Java] 백준 26902번 - IP-adresser
상단으로

티스토리툴바