Skip to content

Commit 96f9b46

Browse files
authored
Merge pull request #807 from gmlwls96/main
2 parents b1e9457 + 11581cb commit 96f9b46

File tree

5 files changed

+183
-0
lines changed

5 files changed

+183
-0
lines changed

coin-change/gmlwls96.kt

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
// 알고리즘 : dp
3+
/** 풀이
4+
* dp배열에 최소한의 동전의 개수를 저장.
5+
* dp[i] = min(dp[i - 동전값], dp[i]) 중 더 작은값이 최소 동전의 개수.
6+
* */
7+
// 시간 : O(coins.len*amount), 공간 : O(amount)
8+
fun coinChange(coins: IntArray, amount: Int): Int {
9+
val initValue = Int.MAX_VALUE / 2
10+
val dp = IntArray(amount + 1) { initValue }
11+
dp[0] = 0
12+
for (i in 1..amount) {
13+
coins.forEach { c ->
14+
if (c <= i) {
15+
dp[i] = min(dp[i - c] + 1, dp[i])
16+
}
17+
}
18+
}
19+
return if (dp[amount] == initValue) {
20+
-1
21+
} else {
22+
dp[amount]
23+
}
24+
}
25+
}

merge-two-sorted-lists/gmlwls96.kt

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Example:
3+
* var li = ListNode(5)
4+
* var v = li.`val`
5+
* Definition for singly-linked list.
6+
* class ListNode(var `val`: Int) {
7+
* var next: ListNode? = null
8+
* }
9+
*/
10+
class Solution {
11+
// 시간, 공간 : o(n+m),
12+
fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
13+
var currentList1: ListNode? = list1
14+
var currentList2: ListNode? = list2
15+
val answerList = LinkedList<Int>()
16+
while (currentList1 != null || currentList2 != null) {
17+
when {
18+
currentList1 == null -> {
19+
answerList.offer(currentList2!!.`val`)
20+
currentList2 = currentList2.next
21+
}
22+
currentList2 == null -> {
23+
answerList.offer(currentList1.`val`)
24+
currentList1 = currentList1.next
25+
}
26+
currentList1.`val` <= currentList2.`val` -> {
27+
answerList.offer(currentList1.`val`)
28+
currentList1 = currentList1.next
29+
}
30+
currentList2.`val` < currentList1.`val` -> {
31+
answerList.offer(currentList2.`val`)
32+
currentList2 = currentList2.next
33+
}
34+
}
35+
}
36+
var answer: ListNode? = null
37+
var currentAnswer: ListNode? = null
38+
while (answerList.isNotEmpty()) {
39+
val num = answerList.poll()
40+
if (answer == null) {
41+
answer = ListNode(num)
42+
currentAnswer = answer
43+
} else {
44+
currentAnswer?.next = ListNode(num)
45+
currentAnswer = currentAnswer?.next
46+
}
47+
}
48+
return answer
49+
}
50+
}

missing-number/gmlwls96.kt

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
fun missingNumber(nums: IntArray): Int {
3+
nums.sort()
4+
var num = nums[0]
5+
for (i in 1 until nums.size) {
6+
if (nums[i] != (num + 1)) {
7+
return num + 1
8+
}
9+
num = nums[i]
10+
}
11+
return num + 1
12+
}
13+
}

palindromic-substrings/gmlwls96.kt

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
// 알고리즘 : brute-force
3+
/** 풀이
4+
* 1. 모든 substring을 전부 뽑아낸다.
5+
* 2. 해당 substring이 palindrome인지 체크한다.
6+
*/
7+
// 시간 : O(n^3)
8+
fun countSubstrings(s: String): Int {
9+
var count = 0
10+
for (len in 1..s.length) { // 길이
11+
for (i in 0..(s.length - len)) { // i : sub string start index.
12+
if (checkPalindrome(s.substring(i, i + len))) {
13+
count++
14+
}
15+
}
16+
}
17+
return count
18+
}
19+
20+
private fun checkPalindrome(subStr: String): Boolean {
21+
return if (subStr.length == 1) {
22+
true
23+
} else {
24+
val reverse = subStr.reversed()
25+
subStr == reverse
26+
}
27+
}
28+
}

word-search/gmlwls96.kt

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
class Solution {
2+
3+
// 풀이 : dfs
4+
// 시간 :O(m * n * 4^w), 공간 :O(m * n + w)
5+
val movePos = arrayOf(
6+
intArrayOf(-1, 0),
7+
intArrayOf(0, -1),
8+
intArrayOf(1, 0),
9+
intArrayOf(0, 1)
10+
)
11+
12+
fun exist(board: Array<CharArray>, word: String): Boolean {
13+
for (y in board.indices) {
14+
for (x in board[y].indices) {
15+
if (existDfs(
16+
board,
17+
Array(board.size) { BooleanArray(board[it].size) },
18+
word,
19+
"",
20+
y,
21+
x
22+
)
23+
) {
24+
return true
25+
}
26+
}
27+
}
28+
return false
29+
}
30+
31+
private fun existDfs(
32+
board: Array<CharArray>,
33+
visit: Array<BooleanArray>,
34+
findWord: String,
35+
currentWord: String,
36+
y: Int,
37+
x: Int
38+
): Boolean {
39+
if (findWord == currentWord) return true
40+
val findChar = findWord[currentWord.length]
41+
if (board[y][x] == findChar) {
42+
val newWord = currentWord + board[y][x]
43+
visit[y][x] = true
44+
for (pos in movePos) {
45+
val newY = y + pos[0]
46+
val newX = x + pos[1]
47+
if (newY >= 0 && newX >= 0
48+
&& newY < board.size
49+
&& newX < board[newY].size
50+
&& !visit[newY][newX]
51+
&& existDfs(
52+
board = board,
53+
visit = visit,
54+
findWord = findWord,
55+
currentWord = newWord,
56+
y = newY,
57+
x = newX
58+
)
59+
) {
60+
return true
61+
}
62+
}
63+
visit[y][x] = false
64+
}
65+
return false
66+
}
67+
}

0 commit comments

Comments
 (0)