Replies: 4 comments 7 replies
-
제가 저번주에 했던 이야기의 요지는 아래와 같고, 제가 이해하고 있는 시간복잡도의 개념은 이 글에 설명하였습니다 :D class Solution(object):
def exist(self, board, word):
rows, cols = len(board), len(board[0])
visit = [[False] * cols for _ in range(rows)]
def word_search(i, j, idx):
# word를 찾은 경우 True 반환하며 탈출
if idx == len(word):
return True
# 현재 탐색하려는 좌표에서 False를 반환하는 경우
# 유의미한 연산을 진행하지 않으므로 시간 복잡도 계산에서 제외되어도 무방하다고 생각함
if i < 0 or i >= rows or j < 0 or j >= cols:
return False
if board[i][j] != word[idx]:
return False
if visit[i][j]:
return False
# 그 외의 경우엔 word_search 함수를 현재 좌표로부터 3방향으로 재귀 호출
# 코드 상으로는 4방향으로 호출하는 것처럼 보이지만
# word_search 첫번째 호출을 제외하면 3방향으로만 재귀 호출한다고 봐야 한다고 생각함
# 왜냐하면 그 전에 방문했던 좌표는 방문해도 바로 False를 반환하기 때문
# 따라서 word의 길이 k가 증가함에 따라 재귀 호출의 수는 3^k 꼴로 증가할 것임
visit[i][j] = True
next_idx = idx + 1
if (word_search(i + 1, j, next_idx) or
word_search(i - 1, j, next_idx) or
word_search(i, j + 1, next_idx) or
word_search(i, j - 1, next_idx)
):
return True
visit[i][j] = False
return False
for i in range(rows):
for j in range(cols):
if word_search(i, j, 0):
return True
return False 따라서 해당 코드의 실행시간
시간 복잡도는 |
Beta Was this translation helpful? Give feedback.
-
이 문제도 면접관과 긴밀한 협의가 필요할 것 같습니다 // 0, 1로 이루어진 매우 큰 배열로 가정
const arr = [0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0... ];
function someAlgorithm(arr: number[]): number {
let result = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 1) {
for (let j = 0; j < arr.length; j++) {
result += arr[j];
}
}
}
return result;
} 위 함수는 명확히 이 코드의 경우:
라는 느낌인 반면,
따라서 입력과 상관없이 탐색의 복잡도는 이 점에서 보면, |
Beta Was this translation helpful? Give feedback.
-
스터디 4기 이번 주에 Word Search 문제가 있어서 답안 코드를 리뷰하다가 갑자기 이 논의가 생각이 났어요. 스터디 3기 때와 비슷하게 역시 대부분의 참여자 분들께서 우선 @obzva 님께서 위에 올려주신 답안 코드의 재귀 함수 내에 로깅을 추가했어요. class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
rows, cols = len(board), len(board[0])
visit = [[False] * cols for _ in range(rows)]
def word_search(i, j, idx):
print(" " * idx + f"{i=}, {j=}, {idx=}") # 👈 로깅 추가
if idx == len(word):
return True
if i < 0 or i >= rows or j < 0 or j >= cols:
return False
if board[i][j] != word[idx]:
return False
if visit[i][j]:
return False
visit[i][j] = True
next_idx = idx + 1
if (
word_search(i - 1, j, next_idx)
or word_search(i + 1, j, next_idx)
or word_search(i, j - 1, next_idx)
or word_search(i, j + 1, next_idx)
):
return True
visit[i][j] = False
return False
for i in range(rows):
for j in range(cols):
if word_search(i, j, 0):
return True
return False 그 다음에 좀 극단적인 예로, 모두 Solution().exist(
[
["A", "A", "A", "A"],
["A", "A", "A", "A"],
["A", "A", "A", "A"]
],
"AAAAAAAAAAAA"
) 그러면 다음과 같이 로그가 찍히는데요. 호출 스택을 관찰해보시면 최대 4번의 재귀 호출이 일어난다는 것을 알 수 있어요. 이러한 경향은 입력 크기를 늘려보면 더 뚜렷히 나타나더라고요. i=0, j=0, idx=0
i=-1, j=0, idx=1
i=1, j=0, idx=1
i=0, j=0, idx=2
i=2, j=0, idx=2
i=1, j=0, idx=3
i=3, j=0, idx=3
i=2, j=-1, idx=3
i=2, j=1, idx=3
i=1, j=1, idx=4
i=0, j=1, idx=5
i=-1, j=1, idx=6
i=1, j=1, idx=6
i=0, j=0, idx=6
i=0, j=2, idx=6
i=-1, j=2, idx=7
i=1, j=2, idx=7
i=0, j=2, idx=8
i=2, j=2, idx=8
i=1, j=2, idx=9
i=3, j=2, idx=9
i=2, j=1, idx=9
i=2, j=3, idx=9
i=1, j=3, idx=10
i=0, j=3, idx=11
i=-1, j=3, idx=12 그래서 많은 분들이 생각하시는 것처럼 이 답안의 시간 복잡도가 |
Beta Was this translation helpful? Give feedback.
-
오랜만에 예전 논의를 다시 보니 반갑네요! 아무래도 함수 호출의 비용 지출을 어떻게 생각하느냐에 따른 관점 차이로 정리할수 있을 것 같아요. 1) 호출 자체가 비용이므로 4방향 -
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Word Search을
DFS
방식을 이용하여 풀 경우의 시간 복잡도에 대해서 이야기 합니다.4주차 모임에서
Word Search
문제 발표자셨던 @TonyKim9401 님의python
코드입니다.Beta Was this translation helpful? Give feedback.
All reactions