diff --git a/src/delf/etc/ln/Ln03.java b/src/delf/etc/ln/Ln03.java new file mode 100644 index 0000000..41e9a38 --- /dev/null +++ b/src/delf/etc/ln/Ln03.java @@ -0,0 +1,74 @@ +package etc.ln; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author delf + */ +public class Ln03 { + public static void main(String[] args) { + System.out.println(new Ln03().solution("1110111100001111101111110000011111", 3)); + System.out.println(new Ln03().solution("001100", 5)); + + } + + public int solution(String road, int n) { + /* array로 표현된 road를 Interval의 List로 변환 */ + List list = new ArrayList<>(); + char[] arr = road.toCharArray(); + boolean isContinue = true; + int start = 0; + for (int i = 0; i < road.length(); i++) { + if (isContinue) { // 정상적인 도로였는데, + if (i == road.length() - 1 || arr[i + 1] == '0') { // 끊기면 + list.add(new Interval(start, i)); // 거기까지가 새 구간 + isContinue = false; + } + continue; + } + if (arr[i] == '1') { // 처음 정상도로를 만나면, + start = i; // 기록 + isContinue = true; + } + } + + int maxLength = 0; + int startIntervalIdx = 0; + do { + int tmpTotal = 0; + int brokenRoad = 0; + for (int i = startIntervalIdx; i < list.size() - 1; i++) { // 시작 구간을 하나씩 옮겨가면서 완성된 구간의 길이 중 최댓값 기록 + Interval interval = list.get(i); + tmpTotal += interval.getLength(); + if ((brokenRoad += interval.getMinimumDistanceTo(list.get(i + 1))) > n) { // 망가진 구간을 메워서 다음까지 연결 시킬 수 있는지 여부 + break; + } + } + maxLength = Math.max(tmpTotal + n, maxLength); // 이번 루프에서 구간의 총 길이 + } while (startIntervalIdx++ < list.size()); + + return maxLength; + } + + // 정상도로 구간 + class Interval { + private int start; // 정상적인 road가 시작되는 위차 + private int end; // 정상적인 road가 끝나는 위치 + private int length; // 구간의 길이 + + public Interval(int start, int end) { + this.start = start; + this.end = end; + length = end - start + 1; + } + + public int getLength() { + return length; + } + + public int getMinimumDistanceTo(Interval interval) { + return interval.start - this.end - 1; + } + } +} diff --git a/src/delf/etc/NV01.java b/src/delf/etc/ln/Ln06.java similarity index 95% rename from src/delf/etc/NV01.java rename to src/delf/etc/ln/Ln06.java index 7e34dc9..2b0ea6b 100644 --- a/src/delf/etc/NV01.java +++ b/src/delf/etc/ln/Ln06.java @@ -1,21 +1,21 @@ -package etc; +package etc.ln; import java.util.*; -public class NV01 { +public class Ln06 { public static void main(String[] args) throws CloneNotSupportedException { - System.out.println(Arrays.toString(new NV01().solution( + System.out.println(Arrays.toString(new Ln06().solution( new String[]{"/", "/hello", "/hello/tmp", "/root", "/root/abcd", "/root/abcd/etc", "/root/abcd/hello"}, new String[]{"mkdir /root/tmp", "cp /hello /root/tmp", "rm /hello"})) ); - System.out.println(Arrays.toString(new NV01().solution( + System.out.println(Arrays.toString(new Ln06().solution( new String[]{"/"}, new String[]{"mkdir /a", "mkdir /a/b", "mkdir /a/b/c", "cp /a/b /", "rm /a/b/c"})) ); - System.out.println(Arrays.toString(new NV01().solution( + System.out.println(Arrays.toString(new Ln06().solution( new String[]{"/"}, new String[]{"mkdir /a", "mkdir /a/b", "mkdir /a/b/c", "cp /a/b /", "rm /a/b/c"})) ); diff --git a/src/delf/programmers/Solution43105.java b/src/delf/programmers/Solution43105.java new file mode 100644 index 0000000..11fd511 --- /dev/null +++ b/src/delf/programmers/Solution43105.java @@ -0,0 +1,29 @@ +package programmers; + +/** + * 정수 삼각형 + * https://programmers.co.kr/learn/courses/30/lessons/43105 + */ +public class Solution43105 { + + public static void main(String[] args) { + System.out.println(new Solution43105().solution(new int[][]{{7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}, {4, 5, 2, 6, 5}})); + } + + public int solution(int[][] triangle) { + int answer; + int n = triangle.length; + int[][] dp = new int[n][n]; + + System.arraycopy(triangle[n - 1], 0, dp[n - 1], 0, n); + + for (int i = n - 2; i >= 0; i--) { + for (int j = 0; j < i + 1; j++) { + dp[i][j] = Math.max(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j]; + } + } + answer = dp[0][0]; + + return answer; + } +}