작성
·
42
0
몇 챕터/몇 강을 수강 중이신가요?: 1-5 알고리즘과 친해지기 (2)
어떤 알고리즘을 학습하고 계신가요?: 최빈값 찾기(알파벳)
여기까지 이해하신 내용은 무엇인가요?:
'a' -> ord('a') -> 97 -> chr(97) -> 'a' 이고, 'A' -> ord('A') -> 65 -> chr(65) -> 'A' 이다. 아스키 코드를 활용하고, 가장 기본이 되는 원리는 이렇다.
0이 26개인 배열(a_o_a)을 만들고, 주어진 문자열(string)을 반복문으로 순회한다. (for char in string: ... )
ord('a') - ord('a') = 0 이고, ord('b') - ord('a') = 1 이고, ... 이 원리에 따라 ord(char) - ord('a') 를 하면, char가 몇 번째 순서의 알파벳인지 구할 수 있다. 이를 0이 26개인 배열(a_o_a)의 인덱스(i)로 활용한다.
string을 반복문으로 순회하면서, (만약 숫자나 띄어쓰기가 아니고 알파벳이라면) a_o_a[i] += 1 을 한다. a_o_a 에 각 알파벳의 빈도수가 저장이 된다.
a_o_a를 반복문으로 순회하면서, max_alphabet_index를 구한다.
chr(max_alphabet_index + ord('a')) 을 하면 최종적으로 최다 빈도수인 알파벳이 구해진다.
저는 string.count(char)를 이용하여 풀었습니다. 그런데 이 아스키 코드 원리를 활용한 알고리즘이 많이 출제되나요? 코테 출제하시는 분들께서 아스키 코드를 활용한 로직을 더 선호하시는지 궁금합니다!
답변 1
0
안녕하세요 Jin 님! 좋은 질문 감사합니다.
문제의 핵심 부분을 정확하게 이해해주신 것 같습니다!
질문 부분에 대해서 말씀드려보겠습니다.
>저는 string.count(char)를 이용하여 풀었습니다. 그런데 이 아스키 코드 원리를 활용한 알고리즘이 많이 출제되나요? 코테 출제하시는 분들께서 아스키 코드를 활용한 로직을 더 선호하시는지 궁금합니다!
string.count(char)
를 사용하면, 사실상 문자열 전체를 매번 순회하게 됩니다. 따라서 각 문자마다 문자열을 전부 탐색하므로 시간 복잡도는 O(N) * N, 즉 O(N²)가 되어 매우 비효율적입니다.
반면, 아스키 코드를 활용하면 한 번의 순회로 빈도를 계산할 수 있어 O(1) * N, 즉 O(N)의 시간 복잡도로 훨씬 효율적입니다.
아스키 코드를 반드시 활용해서 선호하는 것보다는, 더 작은 시간복잡도를 가지고 있기 때문에 선호한다고 봐주시면 될 것 같습니다
파이썬을 하다보면, 이처럼 내장함수라서 매우 간단해보이지만 생각보다 시간복잡도가 높은 함수들이 몇개 존재합니다. 따라서 이런 것들을 주의하면서 코드를 작성해야 할 것 같습니다
좋은 질문 감사합니다 미리 메리크리스마스 보내세요!
헉...그렇군요 내장함수라고 막 쓰면 안되겠네요
미리 메리크리스마스 보내세요~~