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.
-
Word Search을
DFS
방식을 이용하여 풀 경우의 시간 복잡도에 대해서 이야기 합니다.4주차 모임에서
Word Search
문제 발표자셨던 @TonyKim9401 님의python
코드입니다.Beta Was this translation helpful? Give feedback.
All reactions