묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코딩테스트 [ ALL IN ONE ]
연결리스트(Linked List)-1 전반적인 코드
서론class Node: def __init__(self, value=0, next = None): self.value = value self.next = next first = Node(1) second = Node(2) third = Node(3) first.next = second second.next = third first.value = 6 위 코드는 연결리스트-1 강의에 등장하는 코드입니다.first = Node(1)first.next = secondfirst.value = 6위 3개의 코드 모두 "=" 이라는 할당 연산자를 통해서 데이터를 변수에 저장하고 있는데요. "first가 Node(1)을 가리킨다""first.next에는 주소가 저장된다.""first.value에는 6이 저장된다." 뭔가 여기서 저는 뇌에서 뭔가 이상한데(?)라고 느겼습니다. first, first.next, first.value 라는 변수에모두 "="이라는 동일한 할당 연산자를 사용함에도 불구하고,"가리킨다" "값을 저장한다" "주소를 저장한다"파이썬이 천재인가? 동일한 할당("=")연산자인데,어쩔 때는 알아서 가리키고,어쩔 때는 알아서 주소을 저장하고,또 어쩔 때는 값를 저장한다 질문1위 그림을 토대로 말씀드리자면,1."가리킨다" → D관점2."값을 저장한다" → C관점3."주소를 저장한다" → A관점결국엔 다 "동일한 의미"를 다르게 표현하고 있다는 사실입니다. first= Node(1)실제로는 first에 Node(1)의 번지인 100번지(가정)가 저장되어100번지에 저장되어 있는 Node(1)객체를 가리키는 것이고,second=Node(2)실제로는 second에 Node(2)의 번지인 200번지(가정)가 저장되어200번지가 저장되어 있는 Node(2)객체를 가리키는 것이고,first.next = secondsecond에 저장되어 있는 200번지즉 주소를 first.next에 저장해서결국엔 first.next가Node(2)를 가리키게 되는 것이고, first.value에 600번지(가정)가 저장되어 6을 가리키고 있으나C관점에서 "first.value에는 6이 저장"되어 있다라고 표현하고 있는 것 같습니다. 제가 이해한 게 맞나요??결국 다 동일한 의미인 거죠? <질문의도>분명히 저와 같은 생각하시는 분이 계실 것으로생각됩니다.저도 연결 리스트 처음 배울 때파이썬이 천재인가어쩔 때는 "값"을 저장하고,어쩔 때는 "가리킨다"라고 표현하고,어쩔 때는 "주소"를 저장한다라고 표현하고,이 내용이 다른 분들한테 조금이라도 도움이 됐으면좋겠습니다.
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
연결리스트 질문입니다.
선생님 안녕하세요. 질문이 있습니다. 1️⃣ insertAt() 함수에서 에러 처리할 때if(index > this.count) 마지막 인덱스에 데이터가 삽입이 될 수 있어서 초과로 한걸까요?deleteAt(), getNodeAt() 함수에서 에러 처리할 때if(index >= this.count) 마지막 인덱스가 없기 때문에 이상으로 한걸까요? 헤깔려서 정리하면서 여쭤봅니다.2️⃣ insert 함수 만들 때와 다르게 delete, getNode 함수 만들 때 return 한 이유가 궁금합니다. 강의를 반복해서 듣는데. 헤깔리는게 자꾸 생기네요ㅜ..ㅎ
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
선생님 안녕하세요~~ 연결리스트 중 질문입니다.
안녕하세요. 선생님! 손코딩하면서 연결리스트를 다시 듣고 있습니다. 기본 개념인 것 같은데 let list = new LinkedList()말씀하시면서 인스턴스화 했다고 하셨는데 인스턴스화가 무엇인지 궁금합니다. 감사합니다.
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
안녕하세요! 큐 관련 질문입니다.
선생님 안녕하세요. deleteAt 를 만들 때 마지막노드(tail) 제거 하는 부분에서index == this.count -1마자믹 노드인데 this.count-1 하는 이유는 무엇일까요?비전공자로 개발에 도전하고 있는데.. 자료구조 어렵네요ㅜ
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
연결리스트 관련 질문
let currentNode = this.head; for (let i = 0; i < index - 1; i++) { currentNode = currentNode.next; } newNode.next = currentNode.next; currentNode.next = newNode;currentNode = currentNode.next 이 부분이 잘 이해가 안갑니다.
-
미해결코딩테스트 [ ALL IN ONE ]
제가 이해한게 맞는지 확인부탁드립니다. [동적배열 8: 16초]
Array배열의 경우시작주소+ 4*(n-1) 즉 아무리 긴 배열이더라도한번의 연산으로원하는 데이터에 접근할 수 있기 때문에배열 요소에 접근할 때의 시간복잡도는O(1)입니다. 여기까지는 이해가 갑니다.그런데 동적 배열 8:16초에서Dynamic Array의 선언 및 초기화의 시간복잡도가 왜 O(n)인지 이해가 가지 않았는데요 질문1.예를 들어 배열의 사이즈가 3인 경우 (자바로 예를 들어 보겠습니다.)int[ ] array = { 10, 20, 30 };이런 경우 배열의 요소가 3개이므로주소값에 3번을 접근해야 하고,int[ ] array = {1, 2, 3, 4, 5};배열의 요소가 5개 일때는주소값에 5번을 접근해야 하며,int[ ] array = { 1, 2, 3,... n};배열의 요소가 n개 일때는주소값에 n번을 접근해야 한다.따라서 배열의 선언 및 초기화의 시간 복잡도는 O(n)이다. 제가 이해한 게 맞는지 답변 부탁드립니다.<질문하는 의도>"강사님께서 배열에 n개의 데이터를 저장해야 하기 때문에 배열의 선언 및 초기화의 시간 복잡도는 O(n)이다."라고 말씀하셨는데,제가 중간이 이해가 가지 않아서요 질문2.추가적으로 덧붙이자면메모리의 해당 번지에 있는 값을 삭제하기 위해서도 그 번지(주소)에 접근해야 하고,메모리의 해당 번지에 값을 추가하거나 할당하기 위해서 그 번지(주소)에 접근해야 되잖아요.그러면 메모리주소에 "접근"이란 말은 삭제, 할당, 수정, 삽입, 모든 경우에 다 통용되는 단어인거죠??
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
hashFunctrion 메서드
hashFunction 메서드는 해시 테이블 자료구조에서 알고리즘이 들어가는 자료구조이군요.
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
HashTable set 메서드
안녕하세요. 영상 잘봤습니다 강의에서 set 메서드를 구현하실 때 연결리스트이 insertAt을 이용하셨는데 이 때 들어가는 파라미터는 0, new HashData 즉 key값을 0 추가 될 때 마다 head를 하겠다인데 클라이언트에서 연결리스트 인덱스까지 지정해서 할 필요는 없을까요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
셋의 핵심
안녕하세요 영상 잘봤습니다. set에 핵심인 데이터가 증복되지 않게 저장하는데 이 핵심만 지키면 꼭 해세테이블을 이용해서 할 필요가있을까요? 배열이나 연결리스트로 하면은 안될까요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
연결 리스트 삽입과 삭제 질문드립니다.
1분 50초 가량에 배열에서 데이터를 추가하려는 경우 overhead가 많이 발생하는데연결 리스트의 경우 중간에 데이터를 삽입하면 다음을 가리키는 노드만 바꿔주면 되기 때문에간단한 작업이라고 나와 있습니다.(데이터의 삭제도 마찬가지)---------------------------------------------------------------------------------------하지만 4분 9초 가량에 배열과 연결리스트의 삽입과 삭제를 비교하실 때배열은 위의 얘기와 동일한 말씀을 하셨는데( O(n)의 성능을 가진다. )연결리스트에서 "삽입하려는 노드까지 노드를 계속 타고 가야하기 때문에 O(n)의 성능을 가진다."라고 하셨는데 이 말씀은 "중간에 데이터를 삽입하면 다음을 가리키는 노드만 바꿔주면 되기 때문에 간단한 작업"이 말과 충돌한다고 생각합니다.---------------------------------------------------------------------------------------"삽입하려는 노드까지 노드를 계속 타고 가야하기 때문에 O(n)의 성능을 가진다."이 말은 데이터 참조에 해당하는 말이 아닌지 질문 드리고 싶습니다.---------------------------------------------------------------------------------------결국에 제 말이 틀린거라면즉, 연결리스트도 삽입과 삭제 시 O(n)의 성능을 가진다면 배열과 비교했을 때 연결리스트의 유일한 장점은처음에 크기를 지정해 주지 않아도 된다는 점 하나 뿐인 것인가요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
deque.addLast
addLst에서 구현할 때 insertAt으로 구현하셨는데 연결리스트에 구현한 insertLast로 구현하는게 더 직관적인거같은데 insertAt으로 한이유가 있을까요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
스택과 큐의 필요성
스택은 FIFO 큐는 LIFO 구조인데 이 두개를 합친게 덱같네요. 이렇게되면 스택과 큐의 자료구조의 필요성이 잘 느껴지지 않습니다. 덱이 성능이 나쁘게 아니고 연결리스트 덕분에 삽입 제거가 O(1)의 성능이 나오는데 이렇게되면 굳이 스택과 큐를 써야하나싶은데 스택, 큐, 덱이 성능상의 차이점이 있을까요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
강의 내용 포스팅
안녕하세요 자료구조 및 알고리즘 강의 잘 듣고 있습니다.다름이 아니라 제가 개인 블로그에 상업적인 목적 없이공부한 흔적을 남길려는 용도로 해당 강의 내용을 정리하려고 하는데혹시 강의 중간 중간에 나오는 그림이 필요할 경우 출처를 남긴 후사용해도 가능한지 여쭤보고 싶습니다.
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
큐에서 사용하는 연결리스트
영상 잘 봤습니다 ㅎㅎ 큐에서는 처음 들어온 값을 꺼내기 위해서 삭제를 하는데 여기서 성능상 안좋아서 이중연결리스트를 구현해서 사용한걸로 잘 이해됐습니다.근데 스택에서는 단방향 큐에서는 양방향 연결리스트를 사용했는데 그렇다면 연결리스트는 단방향 양방향이 나눠진 자료구조라고 봐야할까요? 아니면 기본적으로 양방향인걸까요? 나눠진 자료구조라하면 큐나 스택같이 개념적으로 구현을 위한 자료구조에서 적절한 연결리스트를 적용해서 구현하는걸까요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
2:23 초 1이 나오기 위해서 이해가 안갑니다.
안녕하세요 감자님다름이 아니라 2:23 초에서 1이 가장먼저 나오기 위해서는 Que 특성상 4, 3, 2가 제거되야 1이 나오는거 아닌가요? 왜 1을 제거를 하는지 이해가 안갑니다.
-
미해결코딩테스트 [ ALL IN ONE ]
Two Sum 문제 질문드립니다.
시간복잡도 O(nlogn)으로 코드를 작성하는 중인데,코드 맨 마지막 줄에서 index 함수를 썼을 때, 중복값은 제일 맨 앞 인덱스만 반환하더라구요.다른 해결 방법이 있을지 궁금합니다!nums = [3,3], target = 6 Output: [0,1]class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: array = sorted(nums) left = 0 right = len(nums)-1 while left < right: if array[left] + array[right] > target: right -= 1 elif array[left] + array[right] < target: left -= 1 elif array[left] + array[right] == target: return [nums.index(array[left]), nums.index(array[right])] # 이 부분
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
javascript stack 다른 자료구조랑 사용해서 구현해야하는 자료구조일까요?
안녕하세요! 영상 잘봤습니다. 제가 알기론 javascript는 다른언어와 다르게 Stack이나 연결리스트를 따로 지원하지 않아 npm 라이브러리 이용하거나 구현해야하는걸로 알고있습니다. 다른 언에서의 자료구조를 안써봐서 잘 모르겠지만 구현해주신거에서는 연결리스트를 이용해서 stack을 구현하셨습니다 하지만 실질적으로 연결리스트 형식으로의 자료구조이고 그 위에 stack을 올려놓은게 맞는걸까요? stack 이라는 거는 결국에 연결리스트와 배열을 이용한 자료구조인거같아서요. 배열이나 연결리스트는 독자적으로 구현이 가능하다면 stack은 배열이나 연결리스트 등 있어야 구현이 가능한? 자료구조로 이해가되네요. 다른 언어에서도 마찬가지일까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
다른 방법의 DFS
다음과 같이 DFS 함수를 작성하는 것도 괜찮은 방법일까요? def DFS(L): global cnt if L == n_size: for x in result_list: print(x, end='') print() cnt += 1 return else: for i in range(L, n_size): if n[L] != '0' and 65 <= int(n[L: i+1]) + 64 <= 90: result_list.append(chr(int(n[L: i+1])+ 64)) DFS(i+1) result_list.pop()
-
미해결파이썬으로 배우는 알고리즘 기초
쉽지 않네요 ㅠ
알고리즘을 공부하려고, 강의를 찾다가 주니온 님의 강의를 듣고 있습니다. 저는 지금 Flutter 앱 개발을 위해서, Dart 언어를 공부하고 있는데, 주니온 님의 강의를 들으면서, Dart 언어에 적용해보는 것이 알고리즘을 이해하는데 도움이 될까요? 아니면, 이런 알고리즘을 적용하기에 좋은 언어가 따로 있을까요? 아직 초반인데, 분할 정복법부터 이해하는 게 많이 어렵네요 ㅠㅠ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
flag return 에 대한 질문입니다.
안녕하세요 선생님 이번 강의에서 flag 변수를 사용해서 return 하여 값을 구하셨는데 if(L===n && f===sum) 의 구문안에서 return 하는 경우에는 결과값이 다르게 나오는데 이러한 이유가 잘 이해가 되지 않습니다.. 재귀함수로 인해 스택에서 함수가 쌓여있어서 그런 것 같은데 이해가 어렵네요 ㅠㅠ