1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 3주차 2강 어떤 알고리즘을 학습하고 계신가요? 선택 정렬 여기까지 이해하신 내용은 무엇인가요? 선택 정렬 원리 2. 어려움을 겪는 부분 어느 부분에서 막히셨나요? 교재 잘못 나온 부분 코드의 어떤 로직이 이해가 안 되시나요? 어떤 개념이 헷갈리시나요? 3. 시도해보신 내용 문제 해결을 위해 어떤 시도를 해보셨나요? 에러가 발생했다면 어떤 에러인가요? 현재 작성하신 코드를 공유해주세요 이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊 딩코님 안녕하세요! 교재에 잘못 나온 부분인가 싶어서 질문 남깁니다. 3주차 선택 정렬 부분에서요 딩코님께서도 이렇게 설명을 하시고, 직접 파이참에서 돌려봤을 때 해당 결과가 이렇게 나왔습니다. 그런데 교재에는 실행결과가 다르게 나와있어서 혹시 교재 잘못나온 건 아닌지 여쭤봅니다. 교재 보면서 혼자 생각정리 하고 있었는데, 아무리 생각해도 실행결과가 저게 아닌 것 같아서 직접 돌려보고 강의도 봤는데 교재에 나온 결과가 안 나오더라고요
강의 코드 function selectionSort(array) { const n = array.length - 1; for (let i = 0; i < n; i++) { let minIndex = i; for (let j = i + 1; j < n; j++) { if (array[j] < array[minIndex]) { minIndex = j; } } if (minIndex !== i) { const temp = array[i]; array[i] = array[minIndex]; array[minIndex] = temp; } } return array; } // console.log(selectionSort([77, 41, 6, 4, 3, 2, 5, 222])); console.log(selectionSort([3, 6, 5, 2, 8, 1])); [문제] 위 방식처럼 하면 n이 array.length - 1 이기때문에 두번째 for문은 j가 마지막 인덱스 이전까지만 수행된다. 즉 마지막 인덱스 요소는 정렬 X [3,6,5,2,8,1]를 예시로 들자면, i가 0일때 j는 1번째 인덱스부터 시작하며 j가 n보다 작을때까지 최소값을 탐색한다. j가 5일때 j < n 조건에 맞지 않아 minIndex를 1로 바꾸는거 실행 X [해결] 따라서 n을 array.length - 1로 할당하지 않고 array.length로 해야함 그러면 두번째 for문에서 j의 조건에 맞아 마지막 인덱스 접근 가능 추가로 i는 마지막 인덱스에 접근할 필요가 없으므로 첫 번째 for문의 조건을 n - 1로 바꾸기. function selectionSort(array) { const n = array.length; for (let i = 0; i < n - 1; i++) { let minIndex = i; for (let j = i + 1; j < n; j++) { if (array[j] < array[minIndex]) { minIndex = j; } } if (minIndex !== i) { const temp = array[i]; array[i] = array[minIndex]; array[minIndex] = temp; } } return array; } // console.log(selectionSort([77, 41, 6, 4, 3, 2, 5, 222])); console.log(selectionSort([3, 6, 5, 2, 8, 1]));
강사님 안녕하세요. "[실습] MyString 클래스 생성자 다중 정의" 강의 6:21 설명에서 생성자에서 this.setString(param) 을 실행할 경우, String 객체가 하나 더 생성된다 하셨습니다. 저는 여기서 param 이 객체 참조를 넘겨주어서 따로 객체가 생성되지 않을 것이라 생각했는데 혹시 어떤 이유로 생성되는지 궁금합니다.
# 1012 T = int(input()) dx = [0, 0, 1, -1] dy = [-1, 1, 0, 0] for _ in range(T): M, N, K = map(int, input().split()) graph = [[0] * M for i in range(N)] st = [] seen = set() # seen.add((0, 0)) for i in range(K): x, y = map(int, input().split()) graph[y][x] = 1 st.append([y, x]) cnt = 0 while st: cur = st.pop() for i in range(4): x = dx[i] + cur[0] y = dy[i] + cur[1] if not (0 <= x < N and 0 <= y < M): continue if (x, y) in seen: continue if graph[x][y] == 0: continue st.append([x, y]) seen.add((x, y)) if (cur[0], cur[1]) in seen: continue else: seen.add((cur[0], cur[1])) cnt +=1 print(cnt) 값이 처음 구현 햇을때 제대로 안나오길래 원래는 cur를 for i in range(4) 위에서 seen에 찍어줬었는데 -> 실패 그래서 cur를 방점을 찍어주듯이 주변을 다 돌고 자신을 seen에 찍게 했더니 통과가 되서 혹시 코드에 조언해주실 수 있는지 질문드립니다!
2-5.링크드 리스트 구현 - 2 02_04_add_node_linked_list.py 해당 내용에서 강의에서는 index 번째에 value 를 추가 하라고 되어있는데, 교재 해당 코드 스니펫의 return문 에는 return "index 번째 Node 뒤에 value 를 추가하세요!" 라고 기재되어있습니다 🙂 풀이 부분은 강의와 동일한데, 해당 부분 먼저 확인해서 문제를 풀면 기준이 조금 달라져서 풀이가 달라지게 되니 문구의 수정이 필요하지 않나 해서 질문 남깁니다!
안녕하세요! JVM 파트를 복습하다가 궁금한 점이 생겨 질문드립니다. Young Generation(Eden → S0 ↔ S1) → Old Generation → Permanent 영역으로 객체가 이동하는 과정에서 객체의 age가 세대 간 이동(Eden → S0 ↔ S1 포함)을 거치며 증가한다고 설명해주셨습니다. 그런데 제가 알고 있기로 age는 Young Generation 내의 Survivor 영역(S0 ↔ S1)을 이동할 때에만 증가하는 것으로 알고 있습니다. age는 객체가 Minor GC를 거쳐 살아남은 횟수로 일반적으로 약 15회 생존하면 Old Generation으로 승격될 수 있는 조건이 되고, Old Generation으로 승격된 이후에는 더 이상 age가 증가하지 않는다고 알고 있습니다. 혹시 이 동작 방식이 JVM 구현체에 따라 달라질 수 있는 부분인지 아니면 제가 알고 있는 age는 다른 age인 것인지 궁금해서 질문드립니다:)
39강의 36분 경에 보여주시는 그림에 보면 Object Header 의 Klass word 가 Metaspace 영역의 Class 클래스의 메타데이터를 가르키고 있습니다. 해당 Class 클래스의 메타데이터 내용을 보면 Object Age 나 Lock Flag 등이 들어가는데 제가 공부하기로는 Object Age 나 Lock Flag 와 같은 개별 인스턴스가 가져야 하는 메타데이터는 Mark Word 에 저장되는 것으로 알고 있었는데, 아닌가요? 그렇다면 이 강의에서 설명하신 바로는 Class 클래스가 클래스로더의 "준비" 단계에서 생성되고, 실제 인스턴스 객체는 나중에 생성된다고 하셨는데 "준비"단계에 생성된 Class 클래스에 인스턴스 별로 다르게 가져야 하는 정보 (age, lock flag 등) 이 어떻게 구별되서 저장되나요?
1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 1-11 def find_count_to_turn_out_to_all_zero_or_all_one(string): # string을 순회하면서 0과 1의 연속된 덩어리 개수를 구함 # 그 개수중 min을 return zero_seq = 0 one_seq = 0 prev_num = string[0] # 첫 bit 초기화 if string[0] == "0": zero_seq += 1 else: one_seq += 1 # 2번째 bit부터 마지막까지 순회 for bit in string[1:]: if bit != prev_num: if bit == "0": zero_seq += 1 else: one_seq += 1 prev_num = bit min_count = min(zero_seq, one_seq) return min_count result = find_count_to_turn_out_to_all_zero_or_all_one(input) print(result) 안녕하세요! 1주차 숙제 중 문자열 뒤집기 문제를 풀면서 궁금한 점이 있어 질문 남깁니다. 저는 풀이가 위 코드와 같이 나왔는데, 정답 코드랑 비교했을때 살짝 다르더라구요. 출력은 잘 나오는 것 같은데, 정확한 차이가 궁금합니다. 저는 현재 bit를 이전 bit와 비교하고, 강사님은 현재 bit를 다음 bit와 비교하는 방식의 차이일까요? 아니면 제 풀이에 문제가 있을까요?
1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 1-10 2. 어려움을 겪는 부분 def find_not_repeating_first_character(string): alphabet_occurrence_array = [0] * 26 for char in string: if not char.isalpha(): continue arr_index = ord(char) - ord("a") alphabet_occurrence_array[arr_index] += 1 not_repeating_character_array = [] for index in range(len(alphabet_occurrence_array)): alphabet_occurrence = alphabet_occurrence_array[index] if alphabet_occurrence == 1: not_repeating_character_array.append(chr(index + ord("a"))) for char in string: if char in not_repeating_character_array: return char return "_" 아래 부분에서 시간복잡도가 O(N²) 인 것 같은데 왜 O(N)인지 궁금합니다. for 문은 O(N) 인 건 알겠습니다! if문에서 char가 not_repeating_character_array 리스트에 포함되어있는지 최악의 경우에 리스트 크기 만큼 돌아야하니까 O(N)라고 생각해서 총 시간복잡도는 O(N) * O(N) = O(N²) 로 계산했습니다... for char in string: if char in not_repeating_character_array: return char
1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 1-5 어떤 알고리즘을 학습하고 계신가요? 알고리즘과 친해지기(2) 여기까지 이해하신 내용은 무엇인가요? max값을 구할 때 리스트의 max 함수를 사용할 수도 있는데 굳이 max 값을 따로 구하는 이유가 있으신가요? 그게 더 시간 복잡도상으로 좋아서인지 초심자 입장에서 생각해보려고 하는 건지 궁금합니다..
# 단어 입력 / 목록 리스트 출력 # 목록 리스트 입력 / 중복 검사 리스트에 이미 있는 요소인지 확인 후 각 요소를 다른 문자가 나오기전까지 중복 검사 리스트에 저장 # 중복 검사 리스트가 온전히 만들어진걸 카운팅 +1 입력 / 카운팅 출력 import sys input = sys.stdin.readline t = int(input()) cnt = 0 words = [] for _ in range(t): words.append(input()) for word in words: used_li = [] cur_word = '' flag = 1 for c in word: if cur_word != c and c not in used_li: cur_word = c used_li.append(c) continue if cur_word == c: continue if cur_word != c and c in used_li: flag = 0 break if flag == 1: cnt += 1 print(cnt) 헤이밥 강의를 보고 평소 풀던 방법이 아닌 모듈화로 쪼개서 풀어보려 하는데 괜찮은지.. 그리고 조건문을 좀 복잡하게 달아서 푼 것같은데 방법론적으로 좋은 접근인지도 조언을 구하고 싶습니다.
안녕하세요 딩코님! 현재 4주차 숙제부분까지 강의를 완료하고 5주차는 실전문제풀이과정이라 해당 과정 들어가기전에 질문이 있습니다. 4주차 까지 들으면서 이전까지는 숙제문제는 바로 코드로 작성하진 못해도 어 이렇게 풀면 되지않을까 하는 구상이 가능했는데 3주차 숙제인 멜론 베스트 앨범뽑기부터 해서 4주차 숙제들은 전부다 문제를 봐도 해당 주차에 배웠던 알고리즘들을 이용해서 풀어보려해도 시작점 조차 생각이 나질않아 바로 해설영상을 보고 따라치는 정도로밖에 하질못해 다시 반복해서 공부할 예정입니다. 5주차 영상부터는 4주차까지의 숙제로 주신 알고리즘 문제를 전부 이해하고 시청하는게 좋을까요 아니면 일단 문제들을 최대한 풀어서 익숙해질떄까지 계속 풀면서 이해하는게 좋을지 궁금합니다. 또 알고리즘 문제를 풀면서 정답이나 해설영상을 몇분까지 풀다가 보면 좋을까요 지금까지는 문제를 풀다가 '아 나 더이상 이 이상은 작성 못하겠어' 할떄 정답과 해설영상을 봐왔는데 이렇게 하니 어려운 문제를 풀때는 시간이 너무 소모되는거 같아 이게 맞나? 싶을떄도 있어 제가 잘못 공부하고있는건지도 궁금합니다!