7년차 서버개발자입니다
다양한 강의를 올려보고 싶습니다!
파이썬, 웹개발, 알고리즘, 개발자 취업 등등..
유튜브 채널 딩코딩코를 운영하고 있습니다
https://www.youtube.com/@%EB%94%A9%EC%BD%94%EB%94%A9%EC%BD%94
강의
로드맵
전체 1수강평
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 단 60분! 파이썬 핵심 개념 초압축 강의 - 이론보다 이해 중심
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
게시글
질문&답변
5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2 질문입니다.
안녕하세요 가희님! 좋은 질문 주셔서 감사합니다!! 먼저, 문제의 핵심 부분을 다시 살펴보겠습니다.매개변수로 주어지는 p는 균형잡힌 괄호 문자열입니다.알고리즘 내에서 w를 분리할 때는 '균형잡힌 괄호 문자열'인 u와 나머지 v로 분리합니다.예시로 주신 "))()(" 케이스를 봅시다:이 문자열은 '('가 2개, ')'가 3개로 균형잡힌 괄호 문자열이 아닙니다.따라서 이 문자열이 매개변수 p로 주어지는 경우는 문제의 조건에 맞지 않습니다.문제는 균형잡힌 괄호 문자열 p가 주어졌을 때, 이를 올바른 괄호 문자열로 변환하는 알고리즘을 구현하는 것입니다. 따라서 W 는 반드시 균형잡힌 괄호 문자열이라고 가정하고 풀어야 할 것 같습니다! 아마 가희님께서 구현하신 코드를 보면,코드에서 is_this_correct_parentheses 함수는 '균형잡힌 괄호 문자열'인지 확인합니다 (열린 괄호와 닫힌 괄호의 개수가 같은지).하지만 루프에서 tmp_u = W[:i]로 분리할 때, 이 부분 문자열이 균형잡힌 괄호 문자열인지 확인한 후 바로 break하면, "더 이상 분리할 수 없는" 조건을 만족시키지 못할 수 있습니다. 즉 제시된 코드는 균형잡힌 괄호 문자열을 올바르게 찾지 못하는 경우가 있어, 예시 "))()(" 같은 입력에서 오류가 발생할 수 있습니다. 그런데 이 예시는 애초에 균형잡힌 괄호 문자열이 아니라서 문제의 전제 조건을 위반합니다. 실전에서는 이런 전제조건에 따라 구현방향성이 매우 갈리는 경우가 많아서, 전제조건에 맞춰서만 구현하는 것을 권장드립니다! 알고리즘 학습 시에는 "만약 이 전제조건이 깨지는 상황에서는 어떻게 하면 문제를 해결할 수 있을까?" 라는 가정을 열어보면서 문제를 해결해보시는 것도 좋을 것 같습니다! 요 관점에서 트라이해보신거라면 짱입니당
- 0
- 1
- 19
질문&답변
강의 진행하면서 이해도 및 진행방향에 대한 질문입니다.
안녕하세요 홍구님 좋은 질문 해주셔서 감사합니다!! 프로그래밍과 알고리즘을 배우는 과정에서 많은 분들이 정말 비슷하게 힘들어 하시는 것 같습니다!! 물론 저도 엄청 처음에 힘들었습니다 ㅋㅋㅋㅋ 코드를 이해하는 것과 직접 작성할 수 있는 것은 분명 다른 과정이라고 생각합니다제 경험에 비추어 보면, 다음과 같은 접근 방식이 효과적이었습니다!개념 이해를 먼저: 모든 개념을 충분히 이해한 다음 문제를 다시 보면서 풀이 방법을 차근차근 생각해보세요.따라 작성해보기: 이해한 코드를 보면서 직접 타이핑해보는 과정이 중요합니다. 처음엔 그대로 따라 적더라도 큰 의미가 있습니다.변형해보기: 코드의 일부를 의도적으로 수정해보고 어떻게 결과가 달라지는지 관찰해보세요. 그 과정에서 내가 사고하는 것들이 맞는지 확인할 수 있습니다.비슷한 문제 풀기: 배운 개념을 적용할 수 있는 유사한 문제를 풀어보면서 사고의 흐름을 체득하는 시간이 필요합니다."이해는 가지만 직접 작성은 어렵다"는 단계는 정말 모든 프로그래머가 거치는 과정입니다! 이 단계에서 멈추지 말고 계속 강의를 들으면서 병행하여 직접 코딩하는 연습을 하시길 권장드립니다. 시간이 지나면 자연스럽게 코드 작성 능력이 향상될 거에요!!결국, 암기보다는 원리 이해와 반복 연습을 통한 체득이 중요합니다. 강의를 통해 개념을 이해하고, 그 개념을 실제로 적용해보는 과정을 반복하다 보면 어느 순간 스스로 코드를 작성할 수 있게 될거에요!!끝까지 포기하지 마시고 꾸준히 연습하시는 홍구님을 옆에서 응원하겠습니다!!이렇게 고민하는 순간부터 실력은 꾸준히 향상되실거에요!!빠이팅이십니다!!
- 0
- 2
- 47
질문&답변
[특.별. 문제집 노션] 문제에서 링크 매칭 문의
안녕하세요 오잇님! 질문주셔서 감사합니다 해당 문제의 경우, 유사한 시중 알고리즘 문제가 존재하지 않아서 SQL 문제를 이용해서 대체했습니다! SQL 내의 요구사항과 비슷한 구현으로 알고리즘 문제가 출시되었다고 봐주시면 좋을 것 같습니다.오잇님이 말씀해주신 것처럼 처음 문제 링크를 들어갔을 때 당황하실 수 있을 것 같아, 테이블에 설명을 추가해두겠습니다 제보해주셔서 감사드립니다!! 더 좋은 자료로 개선하겠습니다 +_+
- 0
- 2
- 70
질문&답변
수강평 인증 이벤트 끝났나요?
안녕하세요! 아직 수강평 이벤트 진행하고 있습니다! 질문 주셔서 감사합니다 __
- 0
- 2
- 101
질문&답변
알파벳 빈도수 세기 정답
안녕하세요 maran님 질문 감사합니다!!제가 교재 부분에 값을 잘못 넣어둔 것을 확인했습니다!! 말씀해주신 코드를 아래와 같이 변경해서 학습 부탁드리겠습니다 잘못된 입력값을 넣어 혼동을 드려 죄송합니다 ;_;더 좋은 강의를 만들 수 있도록 질문해주셔서 넘넘 감사드립니다!!!def find_alphabet_occurrence_array(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 return alphabet_occurrence_array print("정답 = [1, 0, 2, 2, 2, 0, 2, 1, 3, 0, 0, 2, 2, 3, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0] \n현재 풀이 값 =", find_alphabet_occurrence_array("hello my name is dingcodingco")) print("정답 = [1, 0, 0, 0, 2, 0, 1, 1, 1, 0, 0, 2, 1, 0, 2, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0] \n현재 풀이 값 =", find_alphabet_occurrence_array("we love algorithm")) print("정답 = [0, 3, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 3, 2, 0, 0, 0, 1, 0] \n현재 풀이 값 =", find_alphabet_occurrence_array("best of best youtube"))
- 0
- 3
- 57
질문&답변
4-9. 4주차 끝 & 숙제 설명 중 첫번째 농심 라면 공장 문제 질문입니다.
안녕하세요 가희님!! 좋은 질문 감사드립니다!다음과 같이 답변드립니다 질문 1. while stock max_heap을 초기화하지 않는 이유는, 이전에 추가된 공급량을 계속 활용하기 위해서입니다.즉, stock을 업데이트하기 전에 들어온 공급량들과 이후에 새롭게 추가된 공급량들 중에서 최댓값을 뽑아야 하기 때문입니다. 좀 더 구체적으로 설명하면 문제의 핵심은 현재 stock으로 버틸 수 있는 날짜까지의 공급량을 우선순위 큐(최대 힙)에 넣고, 가장 큰 공급량을 먼저 사용하는 것입니다. stock을 업데이트한다고 해서 이전 공급량들이 쓸모없어지는 것이 아니라, 아직 사용되지 않았다면 언제든지 선택할 수 있어야 합니다.따라서 이전 반복에서 추가한 공급량을 계속 유지해야 하므로, max_heap을 초기화하면 안 됩니다. 질문 2. max_heap에 있는 원소들과 새롭게 추가된 원소들 중 전자의 경우에서 max 값이 나올 수 있기 때문인가요?네, 맞습니다!이전 반복에서 max_heap에 추가된 공급량들 중에서 최댓값이 나올 수 있기 때문에, 새롭게 추가된 공급량들과 비교하여 여전히 가장 큰 값을 가져올 수 있어야 합니다.get_minimum_count_of_overseas_supply(4, [4, 10, 15, 20], [20, 5, 10, 5], 40)이 경우를 분석해보면:현재 stock = 4공급 가능 날짜: 4일 → 20 추가max_heap = [20]가장 큰 값 20을 사용 → stock = 24현재 stock = 24공급 가능 날짜: 10일, 15일, 20일 → [5, 10, 5] 추가max_heap = [10, 5, 5]가장 큰 값 10을 사용 → stock = 34현재 stock = 34공급 가능 날짜 없음max_heap = [5, 5]가장 큰 값 5을 사용 → stock = 39현재 stock = 39공급 가능 날짜 없음max_heap = [5]가장 큰 값 5을 사용 → stock = 44 → 목표 달성(k=40) 총 4번의 공급을 받았기 때문에, 정답은 4가 됩니다. 만약 max_heap을 초기화했다면, 이전 공급량들이 사라져서 선택할 수 없게 되고, 잘못된 결과가 나올 수 있습니다. 질문 3. while 문에서 벗어나지 못하는 문제코드에서 무한 루프가 발생하는 이유는 max_heap이 비어 있는데 heappop을 시도했기 때문입니다.즉, stock을 증가시키려고 하는데 추가할 공급량이 없어서 더 이상 진행할 수 없게 됩니다.해결 방법max_heap이 비어있을 경우, 더 이상 공급을 받을 수 없으므로 반복을 중단하는 조건을 추가하면 해결됩니다. if not max_heap: return -1 # 예외 처리 (공급을 받을 수 없는 경우)이렇게 하면 더 이상 공급을 받을 수 없는 경우 즉시 종료할 수 있습니다.
- 0
- 1
- 83
질문&답변
1-5. 알고리즘과 친해지기 (2) 맨 마지막 시뮬레이션 관련 문의
안녕하세요 지혜님!!! 좋은 질문 감사합니다!!시뮬레이션 영상에 대해 질문 주셔도 괜찮습니다!!아마 아래 코드의 2번째 for 문에 대한 동작 방식인 것 같습니다!def find_max_occurred_alphabet(string): alphabet_occurrence_array = [0] * 26 for char in string: if not char.isalpha(): # 얘가 알파벳인지 검사하고 continue arr_index = ord(char) - ord('a') # 해당 문자를 인덱스로 치환합니다. a -> 0 , b-> 1 alphabet_occurrence_array[arr_index] += 1 # 빈도수 배열에 인덱스로 찾아가서 해당 값을 추가해줍니다. max_occurrence = 0 max_alphabet_index = 0 for index in range(len(alphabet_occurrence_array)): # 0,1...25 alphabet_occurrence = alphabet_occurrence_array[index] if alphabet_occurrence > max_occurrence: max_occurrence = alphabet_occurrence max_alphabet_index = index return chr(max_alphabet_index + ord('a'))해당 코드의 2번째 포문에서는 index 를 0부터 25까지 올리면서 max_occurrence 를 탐색하고 있습니다. 그래서 기존 코드의 동작방식은 max_occurrence 가 3인 첫번쨰 인덱스인 8에서 바뀌지 않아야 하는데.... 시뮬레이션에서는 바뀌고 있습니다!!맞습니다. 시뮬레이션 영상이 잘못된 것 같습니다!아마 시뮬레이션 코드 내에서는 다음과 같이 alphabet_occurrence 와 max_occurrence 가 같더라도 변경되는 구조로 작성되어 있어서 ocurrence 값이 3인 것들을 다 넣어주고 있었던 것 같습니다 for index in range(len(alphabet_occurrence_array)): # 0,1...25 alphabet_occurrence = alphabet_occurrence_array[index] if alphabet_occurrence >= max_occurrence: max_occurrence = alphabet_occurrence max_alphabet_index = index 매의 눈으로 시뮬레이션의 다른 알고리즘까지 파악해주시다니!! 감사합니다 ㅎㅎ코드를 완벽하게 이해해주셔서, 질문해주셔서 감사합니다!! 영상은 조만간 변경해두도록 하겠습니다감사합니다!!
- 0
- 2
- 58
질문&답변
(3-8 해쉬-2) hash table 시간복잡도
안녕하세요 수현님! 좋은 질문 감사합니다!!대부분의 알고리즘에서는 최악의 경우(Worst-case)를 기준으로 분석하는 것이 일반적입니다.그 이유는 어떤 입력이 들어올지 확실하지 않기 때문입니다.즉, 입력 데이터에 따라 성능이 달라질 수 있기 때문에, 알고리즘의 성능을 보수적으로 평가하기 위해 최악을 고려하는 것입니다.만약 최선만 고려한다면, 현실에서 예상보다 성능이 낮아질 가능성이 크기 때문입니다.그렇다면 왜 해시 테이블만 최선을 고려하는 경우가 많을까요?이유는 해시 테이블은 현실에서도 최선과 비슷한 성능을 가지기 때문입니다. 해시 테이블을 사용할 때, 보통 좋은 해시 함수를 사용한다고 가정합니다.이 경우 대부분의 키는 서로 다른 해시값을 가지므로 충돌이 거의 발생하지 않으며, 삽입/탐색이 O(1) 로 동작합니다.즉, 현실적인 사용 환경에서는 최선의 경우(O(1))가 가장 자주 발생하므로, 일반적으로 평균적인 성능을 기준으로 설명하는 경우가 많습니다. 물론 해시 테이블도 최악의 경우가 발생할 수 있습니다. 해시 함수가 충돌을 너무 많이 일으키면 O(N) 이 될 수도 있습니다. 예를 들어 보안이 중요한 시스템에서는 해시 테이블의 최악의 경우(O(N))를 고려해야 합니다.해시 충돌을 의도적으로 유도하는 공격(Hash Collision Attack)이 가능하기 때문인데, 이건 한번 찾아보셔도 좋을 것 같습니다!!
- 0
- 2
- 59
질문&답변
03_12_get_max_discount_price를 pop()으로 구현했어요
안녕하세요 박가님! 좋은 질문 감사드립니다!코드를 직접 작성해보신 점이 정말 대단하고, 이런 시도 자체가 실력을 키우는 데 큰 도움이 됩니다! 👍 스스로 고민하고 작성해본 코드라는 점에서 정말 훌륭한 접근 방식이에요.다만, pop()을 사용하는 부분을 조금 더 최적화하면 좋을 것 같습니다. pop()은 리스트의 마지막 요소를 제거하면서 반환하는데, 내부적으로 리스트의 크기를 줄이는 연산이 포함되어 있어 반복적으로 사용하면 성능 저하가 발생할 수 있어요. 특히, 이미 sort()로 정렬된 리스트라면 pop() 대신 인덱스를 활용하여 순차적으로 접근하는 것이 더 효율적입니다. 따라서 인덱스를 활용한 방식으로 개선해보는 것을 추천드립니다!!
- 0
- 2
- 46
질문&답변
1-7. 4:30 에서 N*N이 아닌이유가 뭔가요?
안녕하세요 vlfl0님 좋은 질문 감사합니다! 우선 1-6의 시간 복잡도 먼저 다시 이야기해보겠습니다!def find_max_num(array): for number in array: is_max_num = True for compare_number in array: if number 해당 코드에서 입력값은 array 입니다. 여기에서 array 의 길이를 N 이라고 한다면 for 문을 두번 실행하게 되므로 N^2 의 시간복잡도를 가지게 됩니다. 1-7. 에서 나온 코드는 1-6과는 다른 코드입니다. (1-6: 최댓값찾기 / 1-7: 최빈값 찾기)def find_max_occurred_alphabet(string): alphabet_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z"] max_occurrence = 0 max_alphabet = alphabet_array[0] for alphabet in alphabet_array: occurrence = 0 for char in string: if char == alphabet: occurrence += 1 if occurrence > max_occurrence: max_alphabet = alphabet max_occurrence = occurrence return max_alphabetfind_max_num 에서 array 를 받는 것과는 다르게 alphabet_array의 크기는 정해져있습니다. 딱 알파벳의 길이만큼 정해져있습니다. 바로 26입니다! string 의 길이가 아무리 길더라도, 아무리 짧더라도 관계없이 alphabet_array 의 길이는 26으로 고정되어있기 때문에 상수라고 표현하게 됩니다! 혹시 추가적인 궁금증이 생기시면 편하게 질문 남겨주세요감사합니다
- 0
- 1
- 62