소개
7년차 서버개발자입니다
다양한 강의를 올려보고 싶습니다!
파이썬, 웹개발, 알고리즘, 개발자 취업 등등..
유튜브 채널 딩코딩코를 운영하고 있습니다
https://www.youtube.com/@%EB%94%A9%EC%BD%94%EB%94%A9%EC%BD%94
강의
수강평
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
- 38군데 합격 비법, 2024 코딩테스트 필수 알고리즘
게시글
질문&답변
1-5 알고리즘과 친해지기 (2) - 최빈값(알파벳) 구하기
안녕하세요 Jin 님! 좋은 질문 감사합니다.문제의 핵심 부분을 정확하게 이해해주신 것 같습니다! 질문 부분에 대해서 말씀드려보겠습니다.>저는 string.count(char)를 이용하여 풀었습니다. 그런데 이 아스키 코드 원리를 활용한 알고리즘이 많이 출제되나요? 코테 출제하시는 분들께서 아스키 코드를 활용한 로직을 더 선호하시는지 궁금합니다! string.count(char)를 사용하면, 사실상 문자열 전체를 매번 순회하게 됩니다. 따라서 각 문자마다 문자열을 전부 탐색하므로 시간 복잡도는 O(N) * N, 즉 O(N²)가 되어 매우 비효율적입니다.반면, 아스키 코드를 활용하면 한 번의 순회로 빈도를 계산할 수 있어 O(1) * N, 즉 O(N)의 시간 복잡도로 훨씬 효율적입니다.아스키 코드를 반드시 활용해서 선호하는 것보다는, 더 작은 시간복잡도를 가지고 있기 때문에 선호한다고 봐주시면 될 것 같습니다파이썬을 하다보면, 이처럼 내장함수라서 매우 간단해보이지만 생각보다 시간복잡도가 높은 함수들이 몇개 존재합니다. 따라서 이런 것들을 주의하면서 코드를 작성해야 할 것 같습니다좋은 질문 감사합니다 미리 메리크리스마스 보내세요!
- 0
- 1
- 40
질문&답변
1주차 숙제 두번째 문제 풀이에서..
WonDollar 님 좋은 질문 & 답변 감사합니다!!!
- 0
- 3
- 48
질문&답변
1-10 문제 이런 접근은 어떤가요?
안녕하세요 WonDollar 님 좋은 질문 감사드립니다!! 우선, 시간을 최대한 줄이려고 하는 모습이 너무 열정적이어서 응원을 드리고 싶습니다!!! 멋집니다!! 다만, 아쉽게도 string.replace()는 O(n) 연산으로, 오히려 시간 복잡도를 늘리는 결과를 낳게 되었습니다. 문자열을 변환하거나 자르는 함수는 간단해보이지만 독이 되는 경우가 있습니다. 저는 이 문제를 풀면서 가장 먼저 생각한 것이 '이미 한번 훑은 알파벳에 대해서는 순회를 제외한다' 였거든요.요 생각을 구현하기 위해서, 문자열을 처음부터 끝까지 순회하는 것이 가장 쉬운 방법인 것 같습니다. 코딩테스트를 보면 1 이런 식으로 제한을 두다 보니.. '길이 1억의 string이 주어졌을 때 전부 순회하면 시간이 너무 길어지지 않나..?' 하는 생각이 항상 발목을 잡는 것 같습니다..너무 좋은 걱정 요소입니다. 입력값의 범위에 따라 가능한 알고리즘이 결정되게 되니까, 항상 그 부분에 대해서 고려하며 자신의 풀이를 선택하는 것이 올바른 방향입니다. 위와 같은 입력값에서 가능한 시간 복잡도는 O(N) 혹은 O(logN) 정도일 것입니다. 해당 복잡도 내에서 어떤 알고리즘을 떠올릴 수 있을지 연습해보시길 추천드리겠습니다
- 0
- 1
- 36
질문&답변
1-9 알고리즘 문제 다른 코드
안녕하세요 깡패 햄스터님!! 좋은 질문 감사합니다넵 햄스터님의 말씀이 정확합니다!그리디(Greedy) 알고리즘은 "현재 상황에서 가장 최적의 선택"을 하는 알고리즘입니다. 이 문제는 그리디 알고리즘을 적용하기에 아주 좋은 예시입니다.문제의 핵심 포인트:연산은 왼쪽에서 오른쪽으로 순서대로 진행됩니다.각 단계에서 '+' 또는 '*' 연산 중 최대값을 선택해야 합니다.그리디 알고리즘을 고려해볼 만한 문제의 특징:순서가 중요한 경우각 단계에서 최선의 선택이 전체 최적해로 이어질 수 있는 경우즉, 이 문제는 그리디 알고리즘의 예시로 볼 수 있습니다! 좋은 질문 감사합니다
- 0
- 1
- 75
질문&답변
시간복잡도 설명부분에서 질문이 있습니다
안녕하세요 햄스터님! 좋은 질문 감사합니다프사와 닉네임이 너무 귀엽네요 사실상 첫 번째 코드는 이중 for문이므로 O(N^2)이고, 두 번째 코드는 for문을 각각 1개씩 썼기때문에 O(N)라 시간복잡도면에서 큰 차이가 나지않나해서요요 내용에 대해서 답변을 드려보겠습니다! 먼저, 이중 for문이 반드시 O(N^2)을 의미하는 것은 아닙니다. 시간 복잡도를 판단할 때는 루프의 실제 반복 횟수와 입력 크기를 고려해야 합니다.첫 번째 코드를 자세히 살펴보면:for alphabet in alphabet_array: # alphabet_array의 길이는 26 (상수) for char in string: # string의 길이는 N (변수) # 연산들...여기서 중요한 점은:alphabet_array 루프는 고정된 길이 26을 가집니다. 이는 상수입니다.string 루프는 길이 N으로 변수입니다.따라서 전체 시간 복잡도는 O(26 * N)이 되며, Big O 표기법에서 상수 26은 제거되므로 결국 O(N)이 됩니다.이중 for문이라고 해서 무조건 O(N^2)이 아니라, 각 루프의 입력 크기에 따라 달라집니다. 여기서는 외부 루프가 상수이므로 O(N)으로 볼 수 있습니다또 궁금하신 점이 생기시면 편하게 질문 부탁드립니다 __
- 0
- 1
- 53
질문&답변
1-4 알고리즘과 친해지기 강의에서 풀이 맞는지 확인 좀 부탁드려요~
안녕하세요 재학님! 좋은 질문 남겨주셔서 감사합니다!!말씀해주신대로 실제 동작은 다음과 같습니다:number가 3일 때:전체 배열 [3, 5, 6, 1, 2, 4]와 비교3 number가 5일 때:전체 배열 [3, 5, 6, 1, 2, 4]와 비교5 number가 6일 때:전체 배열 [3, 5, 6, 1, 2, 4]와 비교모든 비교에서 6이 크므로 is_max_num = True 유지6 반환말씀하신 것처럼 compare_number는 매번 전체 배열을 순회합니다. 강의의 주석은 "남은 비교 대상"을 표시한 것으로 보이지만, 실제 코드는 매번 전체 배열과 비교하는 방식으로 동작합니다. 따라서 재학님이 이해하신게 맞습니다! 혼동을 드려 죄송합니다 __
- 0
- 2
- 89
질문&답변
시간 복잡도가 얼마나 걸리는지 확인하는 방법
안녕하세요 창민님! 좋은 질문 감사합니다 ㅎㅎ 시간 복잡도를 판단할 때 중요한 것은 입력값 N에 따라 어떻게 실행 시간이 변하는지입니다! 한 번 나눠서 설명드려보겠습니다.for index in range(len(alphabet_occurrence_array)) 부분 분석:alphabet_occurrence_array의 길이는 항상 26(알파벳 개수)으로 고정되어 있습니다.입력 문자열의 길이가 100이든 1000이든, 이 반복문은 항상 26번만 실행됩니다.따라서 이 부분은 O(1)입니다. (상수 시간)for char in string: 부분 분석:이 반복문은 입력 문자열의 길이(N)만큼 실행됩니다.입력이 커지면 실행 횟수도 비례해서 커집니다.따라서 이 부분은 O(N)입니다.간단한 예시로 설명해드리겠습니다:# 예시 1: O(1) - 상수 시간 def example1(n): for i in range(10): # 입력 크기와 관계없이 항상 10번 반복 print(i) # 예시 2: O(N) - 선형 시간 def example2(n): for i in range(n): # 입력 크기에 비례해서 반복 횟수 증가 print(i) # 예시 3: O(1) - 상수 시간 colors = ['red', 'blue', 'green'] # 고정된 크기 for color in colors: # 항상 3번만 반복 print(color) 핵심 규칙:반복문의 반복 횟수가 입력 크기 N과 무관하게 고정되어 있다면 → O(1)반복문의 반복 횟수가 입력 크기 N에 비례한다면 → O(N)따라서 원래 코드에서:알파벳 배열을 순회하는 부분은 항상 26번 실행 → O(1)문자열을 순회하는 부분은 입력 길이에 비례 → O(N) 즉, 창민님의 질문인 단순히 변수의 for문이면 n 상수의 for문이면 1 이렇게 생각하면 되는건지 궁금합니다!을 답변 드리자면, 변수 여부가 아닌 입력값의 길이에 따라 변화하는지가 더 중요하다고 봐주시면 좋을 것 같습니다!
- 0
- 1
- 101
질문&답변
동일 값 로직 처리
안녕하세요 dkw gh 님! 좋은 질문 감사합니다 ㅎㅎ두 코드가 다른 값을 반환하는 이유는 동일한 빈도의 알파벳이 존재할 때, 최댓값을 판단하는 기준이 다르기 때문입니다.차이점 분석첫 번째 코드 (Counter 기반 코드):Counter는 입력된 문자열의 문자 순서를 유지하며, 각 알파벳의 개수를 세는 딕셔너리 형태로 동작합니다.max(counter, key=counter.get)는 동일한 빈도의 문자가 여러 개일 때, 먼저 등장한 문자를 반환합니다.두 번째 코드 (수동 탐색 코드):모든 알파벳(a-z)을 순회하면서 입력 문자열에서 해당 알파벳의 개수를 직접 계산합니다.max_occurrence 값이 갱신될 때만 max_alphabet을 업데이트합니다.알파벳 배열을 a-z 순서로 순회하므로, 동일 빈도의 문자가 존재하면 사전 순으로 가장 앞에 있는 알파벳이 반환됩니다. 즉, 동일한 빈도일 경우 반환하는 알파벳의 순서 로직이 다르기 때문에 발생한 경우라고 보시면 됩니다! 따라서 좋은 코드를 작성해주셨지만, 구현 방향성에 따라 다른 것이기 때문에 다른 값이 나왔다. 올바른 코드다 라고 봐주시면 될 것 같습니다!
- 0
- 2
- 100
질문&답변
1-4 2번째풀이 관련
안녕하세요 영준님! 좋은 질문 감사합니다 __ 넵 두개의 방식은 다릅니다!배열은 연속적인 자료형태를 담아놓는 자료구조입니다.제 파이썬 강의에서는 이를 서랍장이라고 비유해서 설명하고 있습니다.마치 서랍장의 첫번째 칸에는 A, 두번째 칸에는 B 처럼 자료들을 연속적으로 저장해놓는 것입니다. 그런데 컴퓨터의 경우에는 첫번째 두번째라고 일컫는 것이 아닌, 순서를 0부터 시작한다는 특징이 있습니다.컴퓨터에서 부르는 순서를 바로 인덱스라고 부릅니다. 따라서 "첫번째 칸에 A 가 있다" 가 아니라 "0번째 인덱스에 A가 있다" 라고 부르는 것과 마찬가지입니다. 그렇다면, 저희는 배열(서랍)에 들어가 있는 값들을 어떻게 말할 수 있을까요? 배열에 들어가 있는 것은 A, B 입니다.array = ["A", "B"] 이렇게 되어있다면, 0번째 인덱스의 값은 array[0] 으로 조회할 수 있는데 이 값이 바로 A 입니다.즉, 우리는 인덱스를 이용해서 배열의 원소 값들을 일일이 조회할 수 있는 것입니다. 이렇게 array[0], array[1] 처럼 배열의 값을 조회하는 방식을 반복문을 이용해서 표현할 수 있습니다. 반복문을 사용하는 방식은 크게 두가지가 있는데, 영준님이 질문해주신 것처럼 인덱스를 이용하는 방법과 값을 이용하는 방법이 있습니다. for i in range(len(array)): if array[i] > max_num : max_num = array[i]해당 코드의 경우, len(array) 만큼의 길이 구간들을 i에 넣어주는 인덱스를 뽑아내는 방식이고, for num in array: if num > max_num: max_num = num해당 코드의 경우에는 배열 내의 원소 값을 num 에 넣어주는 값을 뽑아내는 방식입니다. 한 번, for 문을 직접 작성해보고, 출력해보시면 그 차이를 더 극명하게 이해하실 수 있을거에요! 또 질문있으시면 편하게 질문해주세요 __
- 0
- 1
- 123