diff --git "a/youngjoo00/week_14/BOJ_11404_\355\224\214\353\241\234\354\235\264\353\223\234.swift" "b/youngjoo00/week_14/BOJ_11404_\355\224\214\353\241\234\354\235\264\353\223\234.swift" index e69de29..645db33 100644 --- "a/youngjoo00/week_14/BOJ_11404_\355\224\214\353\241\234\354\235\264\353\223\234.swift" +++ "b/youngjoo00/week_14/BOJ_11404_\355\224\214\353\241\234\354\235\264\353\223\234.swift" @@ -0,0 +1,43 @@ +// BOJ_11404_플로이드.swift + +let city = Int(readLine()!)! +let bus = Int(readLine()!)! +let INF = Int.max +var graph: [[Int]] = Array(repeating: Array(repeating: INF, count: city + 1), count: city + 1) + +// 본인은 가중치 0 +for i in 1...city { + graph[i][i] = 0 +} + +for _ in 0.. dp[i/2] + 1 { + dp[i] = dp[i/2] + 1 + path[i] = i / 2 + } + + // 현재 인덱스의 횟수 vs. 인덱스를 3로 나누고 + 1(나누는 데 사용한 횟수) + // 이 둘을 비교해서 적은 횟수를 dp[i] 에 담음 + if i % 3 == 0 && dp[i] > dp[i/3] + 1 { + dp[i] = dp[i/3] + 1 + path[i] = i / 3 + } + } + + print(dp[n]) + + var list: [Int] = [] + + // 인덱스를 갖고 역추적하기 + var current = n + + while current != 0 { + list.append(current) + current = path[current] + } + + list.forEach { print($0, terminator: " ") } +} diff --git "a/youngjoo00/week_15/BOJ_14002_\352\260\200\354\236\245 \352\270\264 \354\246\235\352\260\200\355\225\230\353\212\224 \353\266\200\353\266\204 \354\210\230\354\227\264 4.swift" "b/youngjoo00/week_15/BOJ_14002_\352\260\200\354\236\245 \352\270\264 \354\246\235\352\260\200\355\225\230\353\212\224 \353\266\200\353\266\204 \354\210\230\354\227\264 4.swift" new file mode 100644 index 0000000..a53fb91 --- /dev/null +++ "b/youngjoo00/week_15/BOJ_14002_\352\260\200\354\236\245 \352\270\264 \354\246\235\352\260\200\355\225\230\353\212\224 \353\266\200\353\266\204 \354\210\230\354\227\264 4.swift" @@ -0,0 +1,33 @@ +// BOJ_14002_가장 긴 증가하는 부분 수열 4.swift + +let n = Int(readLine()!)! +let array = readLine()!.split(separator: " ").map { Int($0)! } +var dp = Array(repeating: 1, count: n) + +for i in 0.. array[j] { + // dp 배열에 있는 값중 현재 순회하는 dp[i] 와 직전의 담아둔 값 + 1 중에 어떤 것이 더 큰지 비교 + if dp[i] < dp[j] + 1 { + dp[i] = dp[j] + 1 + } + } + } +} + +var LIS: [Int] = [] +var length = dp.max()! +print(length) + +// 역순으로 순회 +for i in (0.. 0 && j > 0 { + // 위쪽으로 이동: 현재 위치의 값이 위쪽 값과 같은 경우 + if dp[i][j] == dp[i-1][j] { + i -= 1 + } else if dp[i][j] == dp[i][j-1] { // 왼쪽으로 이동: 현재 위치의 값이 왼쪽 값과 같은 경우 + j -= 1 + } else { + // 대각선으로 이동: 현재 위치의 값이 왼쪽 위 대각선 값 + 1인 경우. + // 해당 문자가 LCS에 포함되므로 결과 배열에 추가 + result.append(input1[i-1]) + i -= 1 + j -= 1 + } +} + +// 결과 배열을 뒤집어서 올바른 순서로 만듬 +let reversedResult = result.reversed() + +// 결과 배열이 비어있지 않다면, 결과 배열의 각 문자를 출력함 +if !reversedResult.isEmpty { + reversedResult.forEach { print($0, terminator: "") } +} \ No newline at end of file