묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨코딩테스트 [ ALL IN ONE ]
DLinked List를 활용한 insert에서 메모리 할당해제관련해서 질문이 있습니다. (BrowserHistory)
class Node { let value: String var prev: Node? var next: Node? init(value: String, prev: Node? = nil, next: Node? = nil) { self.value = value self.prev = prev self.next = next } } class BrowserHistory { var head: Node? var current: Node? init(_ homepage: String) { let newNode = Node(value: homepage) self.head = newNode self.current = newNode } func visit(_ url: String) { self.current?.next = Node(value: url, prev: self.current) self.current = self.current?.next } //..생략 }강의를 듣던중 의문이 생겨서 질문남깁니다. visit시에 참조가 새로운 노드로 변경되기 때문에 그 이전에 current뒤에 존재하는 Node들은 뒤에 몇만개가 있더라도 맨앞에 있던 노드의 참조를 가르키는 곳이 없기 때문에 모두 메모리에서 가비지 컬렉터에 의해 메모리에서 지워진다라고 말씀하셨는데, 뒤에 1개의 Node가 있는 경우는 그렇지만 Doubly Linked List의 경우 그 뒤에 Node들의 prev로 그 이전 Node들을 가르키고 있어 참조하는 곳이 최소 1개 이상은 존재하게 되어 메모리에서 할당해제가 되지 않을 것이라고 생각했습니다. 따라서 visit당시에 뒤에 있는 Node들도 메모리에서 할당해제가 되게끔 리스트의 끝까지 돌면서 Node의 next만 지워주고 테스트해보자고 생각해서 아래와 같이 코드를 수정하였습니다. func visit(_ url: String) { var tmp = self.current while tmp?.next != nil { var before = tmp tmp = tmp?.next before?.next = nil } self.current?.next = Node(value: url, prev: self.current) self.current = self.current?.next }이를 LeetCode의 결과로 확인해보니 물론 속도는 5ms 줄었지만, 메모리 4MB정도 줄일 수 있었습니다.Swift의 경우 가비지 컬렉터가 아닌 ARC가 컴파일 타임에 Reference Count를 확인하기 때문에 그 동작 방식에서의 차이에서 비롯된 차이인지 궁금합니다.가비지 컬렉터에서는 실제로 위의 같은 경우에도 메모리 할당 해제가 되는건가요??
-
해결됨코딩테스트 [ ALL IN ONE ]
디코
디코를 사정이 있어 나가게 되어 다시 초대받을 수 있는지 궁금합니다.
-
해결됨코딩테스트 [ ALL IN ONE ]
num of Islands를 복습하면서 궁금한 것이 있습니다.
먼저 제가 짠 시간초과 난 소스코드는 다음과 같습니다from collections import deque class Solution(object): def numIslands(self, grid): m = len(grid) # row n = len(grid[0]) # col visited = [] ans = [[False] * n for _ in range(m)] # ans의 용도가 뭐지? cnt = 0 def bfs(x, y): q = deque() # 사전 세팅 q.append((x, y)) visited.append((x,y)) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] while q: cur_x, cur_y = q.popleft() # (0,0) for i in range(4): next_x = cur_x + dx[i] next_y = cur_y + dy[i] if next_x >= 0 and next_x < m and next_y >= 0 and next_y < n: if grid[next_x][next_y] == "1" and (next_x, next_y) not in visited: q.append((next_x, next_y)) visited.append((next_x, next_y)) ans[next_x][next_y] = True # 완전탐색 for i in range(m): for j in range(n): if grid[i][j] == "1" and (i, j) not in visited: bfs(i, j) cnt += 1 return cnt grid = [ ["1", "1", "0", "0", "0"], ["1", "1", "0", "0", "0"], ["0", "0", "1", "0", "0"], ["0", "0", "0", "1", "1"], ] sol = Solution() print(sol.numIslands(grid)) # O/P: 3발상은 비슷한 것 같은데, 기억에서는 ans를 저렇게 작성한 것 같아서 위와 같이 초기화를 했지만 ans의 용도를 몰랐고 bfs 템플릿을 참고해서 visited.append()로 방문한 정점을 추가했습니다. 그런데 이렇게하면 테스트케이스 48/49에서 시간초과가 났습니다. 왜 그런지 알 수 있을까요?
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
3강 3번 문제. 텐트세우기 #2304
안녕하십니까 코딩센세 훗날 일본 개발자 취업을 희망하는 코린이 입니다.저번 시간에도 궁금한 점이 있어서 질문 드렸지만, 오늘도 어김없이 궁금한 점이 생겨서 이렇게 게시판에 글을 작성합니다.3번 문제는 숙제로 주셨지만, 컨셉만 도출하고 코드는 30분 이상 걸리도록 구현을 못하여 강의록의 솔루션 코드를 이해하고 있는 중입니다.서론은 이만하고 바로 본론으로 들어가겠습니다. 본론에 해당 부분은 질문의 내용입니다.솔루션 코드를 해석하는 중에 # 정답 합치기 부분에 질문이 있습니다. 그 부분은 바로 maxPoint[1] - maxPoint[0] + 1 코드가 왜 필요한지 입니다. 아마도 추정컨대 높은 기둥이 넓이를 구해서 더해주는 연산으로 보입니다만, 항상 밑변이 1이라는 문제의 가정이 있었는데도 answer += 1*maxHeight 또는 answer += maxHeight가 오답인 근거를 듣고 싶습니다!바쁘신 와중에도 답변에 신경써주셔서 감사드립니다.
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
유효성 검사에 대해 질문이 있습니다.
좋은 강의 만들어주셔서 감사합니다.몇몇 메서드가 실행될 때 인덱스의 유효성 검사를 진행하는데, 이 부분의 로직이 완전히 같은 상황이니 유효성 검사 메서드를 따로 생성해서 리팩토링 하는 것도 좋은 방법일까요?
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
PyPy3와 Python3
백준에서 bfs와 dfs 관련 문제를 추가적으로 풀다보니까, Python3에서는 시간 초과를 해결되지 않는 문제가, PyPy3에서는 해결되는 경우가 있습니다.이럴 때는 Python3에서도 해결 가능하도록 시간 복잡도를 줄이기 위해 노력해야 할까요?아니면 PyPy3 환경에서 정답임을 만족해야 할까요...?
-
해결됨코딩테스트 [ ALL IN ONE ]
딕셔너리를 활용한 two-sum 질문있습니다
기존코드def two_sum(nums, target): memo = {} for v in nums: memo[v] = 1 for v in nums: needed_number = target - v if needed_number in memo: return True return False기존 코드에서 첫번째 for문은 O(n)이고두번째 for문은 O(1)이 n번 실행되니까 최종적으로는 O(n)이 되어서 해당 알고리즘의 시간복잡도는 O(n)이되는데처음에 문제를 설명해주실때의 순서대로라면 4를 먼저넣고 target이 14니까 10이 있는지 확인해보고 없으니까 1을 넣고 13이없는지 확인해보고 없으니까 9를 넣고 5가 없으니까 7을 넣고 7이 없으니까 5를 넣고 9가 있으니까 true를 반환 이라고 생각을 했고 그렇게 로직을 짜면 아래와 같은 코드가 될것같습니다(제가 파이썬을 잘 몰라서 정확한지는 모르겠네요 ㅠㅠ)def two_sum(nums, target): memo = {} for v in nums: memo[v] = 1 needed_number = target - v if needed_number in memo: return True return False해당 코드에서는 첫번째 for문 내부의 시간복잡도가 전부다 O(1)이고 그걸 n번 반복하는것이니 O(n)이라는 최종적인 시간복잡도라고 생각을 하는게 맞을까요??만약에 아래에 짠 로직이 올바른 로직이라면위에 로직은 n번 연산하면서 dictionary에 넣고 후에 요소를 돌면서 답을 찾고아래로직은(코드가 맞다면) dictionary를 다 넣지 않더라도 중간에 값이 나오면 중간에 연산을 끝낼 수 있으니까 조금더 효율적이라고 생각을 했습니다제가 생각한 방식이 맞는지 그리고 이런 작은(?)효율성이 코딩테스트에서 의미있게 다가올지가 궁금합니다!
-
미해결비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)
최소힙의 결과값과 최대힙->최소힙 결과값이 다른게 맞나요?
최소 힙 insert#reheapUp(index) { // index 0은 root if (index > 0) { // 부모 노드가 root가 아니면 계속 비교 const parentIndex = Math.floor((index - 1) / 2); if (this.arr[index] < this.arr[parentIndex]) { // 값 바꾸기 const temp = this.arr[index]; this.arr[index] = this.arr[parentIndex]; this.arr[parentIndex] = temp; this.#reheapUp(parentIndex); } } } // O (log n) insert(value) { this.arr.push(value); this.#reheapUp(this.arr.length - 1); }const heap = new MinHeap(); // insert는 큰 값부터 넣고, root가 8이 되는지 확인 heap.insert(78); heap.insert(56); heap.insert(45); heap.insert(32); heap.insert(23); heap.insert(19); heap.insert(8); // [8, 32, 19, 78, 45, 56, 23] heap; 최대 힙 insert#reheapUp(index) { // index 0은 root if (index > 0) { // 부모 노드가 root가 아니면 계속 비교 const parentIndex = Math.floor((index - 1) / 2); if (this.arr[index] > this.arr[parentIndex]) { // 값 바꾸기 const temp = this.arr[index]; this.arr[index] = this.arr[parentIndex]; this.arr[parentIndex] = temp; this.#reheapUp(parentIndex); } } } // O (log n) insert(value) { this.arr.push(value); this.#reheapUp(this.arr.length - 1); }const heap = new MaxHeap(); // insert는 작은 값부터 넣고, root가 78이 되는지 확인 heap.insert(8); heap.insert(19); heap.insert(23); heap.insert(32); heap.insert(45); heap.insert(56); heap.insert(78); // [78, 32, 56, 8, 23, 19, 45] heap; 최대 힙 -> 최소 힙// 최소 힙 유지 함수 #heapifyMin(index) { // 수정, 삭제 const leftIndex = index * 2 + 1; const rightIndex = index * 2 + 2; const smallerIndex = (this.arr[leftIndex] || 0) < (this.arr[rightIndex] || 0) ? leftIndex : rightIndex; if (this.arr[index] > this.arr[smallerIndex]) { // 값 바꾸기 const temp = this.arr[index]; this.arr[index] = this.arr[smallerIndex]; this.arr[smallerIndex] = temp; // 재귀적으로 최소 힙 유지 this.#heapifyMin(smallerIndex); } } toMinHeap() { // O(1/2n) for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { this.#heapifyMin(i); } }const heap = new MaxHeap(); // insert는 작은 값부터 넣고, root가 78이 되는지 확인 heap.insert(8); heap.insert(19); heap.insert(23); heap.insert(32); heap.insert(45); heap.insert(56); heap.insert(78); // [78, 32, 56, 8, 23, 19, 45] heap.toMinHeap(); // [8, 23, 19, 32, 78, 56, 45] heap; // 최소 힙 insert 결과 값 [8, 32, 19, 78, 45, 56, 23] // 최대 힙 insert 결과 값 [78, 32, 56, 8, 23, 19, 45] // 최대 힙 -> 최소 힙 결과 값 [8, 23, 19, 32, 78, 56, 45] 최소힙 insert 결과 값과 최대 힙 -> 최소 힙 결과 값은 서로 다른데 최소 힙의 조건은 아래가 크고, 위가 작다. 라고 하셨으니 결과 값은 달라도 최소 힙의 조건이 맞으니 최대 힙 -> 최소 힙 변환 코드가 맞는걸까요?
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
백준 2606
안녕하세요 선생님! 복습하다가 의문점이 생겨 질문드립니다.from collections import defaultdict N = int(input()) T = int(input()) dic = defaultdict(list) discovered = [] for _ in range(T): a, b = map(int, input().split()) dic[a].append(b) dic[b].append(a) def dfs(node): global dic, discovered discovered.append(node) for n in dic[node]: if n not in discovered: dfs(n) return dfs(1) print(len(discovered) - 1)이 코드에서 dic[b].append(a)를 지워도 문제 해결에는 영향이 없어 보이는데, 백준에 제출하면 틀린 답으로 나옵니다.즉, 그래프를 양방향이 아닌 단방향으로 설정해도 문제 없지 않나요..?
-
해결됨코딩테스트 [ ALL IN ONE ]
2차코테 관련해서 질문드립니다
코테를 볼때 1차 2차 나눠서 보는 기업이 있더라구요 (대표적으로 카카오)근데 1차는 알고리즘이고 2차는 api 통신을 해야하는 코테로 진행한다고 봤는데 이렇게 api통신을 이용해 코테를 보는 기업이 많을까요? 제가 찾을때는 카카오만 보여서 질문드렸습니다또 sql 코테를 보는곳도있다고 들었는데 이것도 많이 보는지 여쭤보고 싶습니다
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
백준 11720 숫자의 합 질문 있습니다
문제를 보면입력첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.라고 조건이 주어지는데 강의의 풀이를 보면 숫자의 개수를 N개로 제한하는 부분이 없고 실행해보면 N개 이상 또는 이하의 숫자가 들어가도 상관이 없이 실행되는데 보통 코테에서도 이런식으로 제한에 러프하게 코딩해도 상관이 없는 건가요?아니면 문제에 제한이 있어서 코딩에서는 제한을 따로 두지않는건가요??
-
해결됨코딩테스트 [ ALL IN ONE ]
노션 링크 좀 보내주세요
노션 공유 요청 드리고 24시간 기다렸는데.......노션에 어떻게 들어가나요?
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
dfs 매개변수에서 y,x 를 왜 순서를 반대로 쓰셨는지 궁금합니다.
점프왕 젤리문제에서 dfs 메서드에 dfs(int x, int y)가 아닌 dfs(int y, int x)인지 궁금합니다!이전 문제부터 계속 궁금해했는데, 왜 순서를 바꾸셨는지에 대한 명확한 이유를 못찾겠어서 질문올렸습니다.// 점프왕 젤리 import java.util.*; import java.io.*; class Jump_king_jelly { static final int MAX = 3 + 100 + 10; static int map[][]; static boolean visited[][]; static int N; static int dirY[] = {1, 0}; static int dirX[] = {0, 1}; public static void dfs(int y, int x) { visited[y][x] = true; if(y == N && x == N) return; for(int i = 0; i < 2; i++) { int newY = y + dirY[i] * map[y][x]; int newX = x + dirX[i] * map[y][x]; if(visited[newY][newX] == false) { dfs(newY, newX); } } } public static void main(String[] args) throws IOException { // 0. 입력 및 초기화 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); N = Integer.parseInt(br.readLine()); map = new int[MAX][MAX]; visited = new boolean[MAX][MAX]; // 1. map에 정보 반영 for(int i = 1; i <= N; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); for(int j = 1; j <= N; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } // 2. dfs 수행 dfs(1,1); // 3. 출력 if(visited[N][N]) bw.write("HaruHaru"); else bw.write("Hing"); bw.close(); br.close(); } }
-
미해결2주만에 통과하는 알고리즘 코딩테스트 (2024년)
[최적화 (정수론) 21:41 강의 질문] 문제 설명 중에 8까지의 예시를 이해하기 어렵습니다.
안녕하세요 강사님!파이썬 코딩테스트 도전하고 싶은 코린이입니다.강의를 듣고 있던 와중에 21:41초에서 계산하는 8까지의 예시 케이스를 설명하는데, 결과로 나오는 수열이 어떤 수열인지, 연산은 어떻게 되는건지 잘 이해가 되지 않습니다... 1 2 3 4 5 6 7 81 2 1 ... <<< 이게 무슨 수열인거죠? 어떻게 나온거죠? 조금만 더 상세히 설명해주시면 감사하겠습니다...문제 지시문과 영상을 여러번 읽어보아도 잘 이해가 되지 않아서 질문 남깁니다!
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
코딩 센세 입니다!
이번에 이직 후 회사에서 많은 것을 배우고 밤늦게까지 정리하며 잠드는 날들을 반복하고 있습니다! (외국어의 벽도 느끼고 있습니다 ... 하하 ) 질문해주신 질문들의 답변을 못달아드려서, 강의 수정을 빨리 빨리 못해드려서 정말 죄송합니다 ㅠㅜ... 항상 많은 질문 해주시고 공부해주시는 분들 감사합니다! 바로 답변을 못달아드릴때도 있지만 제 강의 열심히 들으시고 생기시는 궁금증들 질문해주시는 건 정말 정말 기뻐요 😄 제가 바로 답을 못 드리더라도 꼭 답을 드릴테니 간단한 궁금증이나 생각들도 모두 커뮤니티에 꼭 남겨주세요! 항상 많은 힘을 주셔서 감사합니다 😃 !!!!! 오늘도 다들 화이팅이에요!
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
22479번 문제 런타임 에러 도와주세요 ㅠㅠ
24479번, 강의 사진과 같이 아래 링크처럼 파이썬으로 코딩했는데, 런타임 에러가 나고 있어요 ㅠㅠ 도와주세요 https://www.acmicpc.net/source/70097735 강의 영상마다 질문이 있으면 언제든 그리고 바로 질문 남겨주세요! 질문할 때 가장 정확하게 이해할 수 있습니다.해당 영상과 관련된 질문들을 해주실 때 제가 가장 정확히 답변 드릴 수 있습니다!취업 전반의 상담이나, "제 코드가 왜 틀렸는지 알려주세요"와 같이 광범위한 질문은, 질문자의 상황에 따라 답변이 달라질 수 있기 때문에, 정확한 답변을 드리기가 어렵습니다 :(이런 분들을 위해서는 멘토링 항목으로 별도 제공하고 있으니, 다음 링크를 참고해주세요!이 링크를 통해서는 본인의 코드가 왜 틀렸는지 모를 때 질문을 주셔도 좋고, 취업 전반(면접 준비, 자소서, CS 면접 등)에 관련한 질문을 주시면 답변 드리겠습니다 :)"이 질문은 해도 되나?"라는 생각이 드신다면 우선 남겨주세요! 제가 답변 드리기 어려운 건 멘토링에 올려 달라고 재요청 드리겠습니다 :)
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
1강 문제2 (백준 # 14568)
n = int(input()) answer = 0 for i in range(1, n+1): for j in range(1, n+1): for k in range(1, n+1): if i + j + k == n: if i % 2 == 0: if j >= k+2: if i >= 1 and j >= 1 and k >= 1: answer += 1 print(answer)왜 if i >= 1 and j >= 1 and k >= 1: 이 조건이 없어도 정답처리가 되나요??
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
(숫자의 합)1<=N <=100 사이의 값
N이 1과 100사이의 값이 왜 char인지 보기위해서 모든타입의 범위를 보았는데 char 범위가 \u0000~\uffff(0~2^15-1)이더라구요 이게 1과 100의 값인건가요?
-
미해결코딩테스트 [ ALL IN ONE ]
o(1)과 o(n)이 헷갈려요
big o(1)은 한번의 연산만 한다는건 이해를했는데 o(n)은 정확히 어떤뜻인지 모르겠어요..
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
소수구하기-백준 1929 질문
안녕하세요 강의 너무너무 잘보고 있습니다소수구하기 백준 1929 강의 중for(소수의 배수값을 N까지 반복) for (int j=i+i; j<=N; j=j+i){ }이 부분에서 for문 시작 ( j=i+i )이랑 증감식 ( j=j+i ) 이 이해가 잘 되지않아질문 남깁니다.그리고 저 for문은 컨티뉴일 경우에는 실행이 안되는건가요 ?(ex)4이면 컨티뉴 >> 하고 for문을 도는건가요?) 감사합니다