Skip to content

[이유진] Week 7 #946

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions longest-substring-without-repeating-characters/Real-Reason.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package leetcode_study

/**
* 시간복잡도 : O(n) ?
* -
* 공간복잡도 : O(n)
* - charAndIdx 에 최대 n개의 문자에 대해서 담을 수 있으므로 O(n) 의 공간복잡도를 가집니다.
* */

fun lengthOfLongestSubstring(s: String): Int {
var point = 0
val charAndIdx = HashMap<Char, Int>()
var cnt = 0
var maxCnt = 0

while (point < s.length) {
val nowChar = s[point]
if (nowChar !in charAndIdx.keys) {
charAndIdx[nowChar] = point
cnt += 1
point += 1
} else {
val prevSameCharIdx = charAndIdx[nowChar]!!
point = prevSameCharIdx + 1
charAndIdx.clear()
cnt = 0
}

maxCnt = maxOf(cnt, maxCnt)
}

return maxCnt
}
57 changes: 57 additions & 0 deletions number-of-islands/Real-Reason.kt
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 문제는 DFS가 아닌 BFS 아닐까요? :)

Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package leetcode_study

/**
* n: rowSize, m: colSize
* 시간복잡도 : O(n*m)
* - 전체 그리드를 한번씩만 방문하므로, 시간복잡도는 O(n*m) 과 같습니다.
* 공간복잡도 : O(n*m)
* - 방문이력에 대해 visited 를 저장하므로, 시간복잡도는 O(n*m) 과 같습니다.
* */
class NumberOfIsland {
val directions = listOf(
Pair(-1, 0),
Pair(1, 0),
Pair(0, -1),
Pair(0, 1)
)
var rowSize = 0
var colSize = 0
var visited: Array<BooleanArray>? = null

fun numIslands(grid: Array<CharArray>): Int {
rowSize = grid.size
colSize = grid[0].size
visited = Array(rowSize) { BooleanArray(colSize) }

var islandCnt = 0

for (i in 0 until rowSize) {
for (j in 0 until colSize) {
if (grid[i][j] == '1' && !visited!![i][j]) {
dfs(i, j, grid)
islandCnt += 1
}
}
}

return islandCnt
}

fun dfs(r: Int, c: Int, grid: Array<CharArray>) {
visited!![r][c] = true

for ((dr, dc) in directions) {
val (nr, nc) = Pair(r + dr, c + dc)
if (isValid(nr, nc, grid)) {
dfs(nr, nc, grid)
}
}
}

private fun isValid(r: Int, c: Int, grid: Array<CharArray>): Boolean {
return r in 0 until rowSize &&
c in 0 until colSize &&
grid[r][c] == '1' &&
!visited!![r][c]
}
}
63 changes: 63 additions & 0 deletions reverse-linked-list/Real-Reason.kt
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코틀린이 기본적으로 null 허용을 하지 않다보니 이런 어려움이 있군요;;
시간적으로 여유가 있으시다면 다른 분들 풀이 참조하셔서 5~6줄 정도로 간단하게 리팩토링 해보시는 것도 좋을것 같습니다!

Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package leetcode_study

/**
* 첫번째 문제풀이
* 시간복잡도 : O(n)
* - n 번을 순회하며 nodes 에 저장하고, 다시 nodes 에서 노드를 하나씩 꺼내어 연산하므로 O(2n) -> O(n) 입니다.
* 공간복잡도 : O(n)
* - n 개의 노드를 nodes 에 저장하므로 O(n) 입니다.
*
* 두번째 문제풀이
* 시간복잡도 : O(n)
* - curr 이 null 일때까지 while 문을 돌고 있으므로, n번의 순회가 발생할 것입니다. 따라서 시간복잡도는 O(n) 입니다.
* 공간복잡도 : O(1)
* - nodes 를 저장했던 첫번째 풀이와 달리 prev, curr 두개의 상수만을 사용하므로 O(1) 만큼의 공간복잡도를 가집니다.
* */
class ReverseLinkedList {
class ListNode(var `val`: Int) {
var next: ListNode? = null
}

fun reverseList(head: ListNode?): ListNode? {
var nowNode = head
val nodes = mutableListOf<ListNode>()

while (nowNode != null) {
nodes.add(nowNode)
nowNode = nowNode.next
}

val dummy = ListNode(-1)
nowNode = dummy

while (nodes.isNotEmpty()) {
val popNode = nodes.removeLast()
nowNode?.next = popNode
nowNode = nowNode?.next
}

nowNode?.next = null

return dummy.next
}
}

class ReverseLinkedList2 {
class ListNode(var `val`: Int) {
var next: ListNode? = null
}

fun reverseList(head: ListNode?): ListNode? {
var prev: ListNode? = null
var curr = head

while (curr != null) {
val temp = curr.next
curr.next = prev
prev = curr
curr = temp
}

return prev
}
}
Loading