인프런 커뮤니티 질문&답변

dkw gh님의 프로필 이미지
dkw gh

작성한 질문수

38군데 합격 비법, 2024 코딩테스트 필수 알고리즘

1-5. 알고리즘과 친해지기 (2)

동일 값 로직 처리

작성

·

33

·

수정됨

0

1. 현재 학습 진도

  • 1-5 알고리즘과 친해지기(2)

 

2. 어려움을 겪는 부분

# def find_max_occurred_alphabet(string):
#     alphabet = [0] * 26
#     for i in string:
#         if i.isalpha():
#             alphabet[ord(i) - ord('a')] += 1
#
#     max = alphabet[0]
#     index = 0
#     for i in range(len(alphabet)):
#         if alphabet[i] > max:
#             max = alphabet[i]
#             index = i
#
#     return chr(index+ord('a'))


from collections import Counter


def find_max_occurred_alphabet(string):
    string = [char for char in string if char.isalpha()]

    counter = Counter(string)
    print(counter)

    return max(counter, key=counter.get)


result = find_max_occurred_alphabet

print("정답 = i 현재 풀이 값 =", result("hello my name is dingcodingco"))
print("정답 = e 현재 풀이 값 =", result("we love algorithm"))
print("정답 = b 현재 풀이 값 =", result("best of best youtube"))

 

image.png

3. 시도해보신 내용

 안녕하세요. 첨부한 코드 중 주석 처리한 부분은 문제를 보고 사전에 제가 작성한 코드입니다. 결과는 예상과 동일하게 출력됩니다.

그 밑에는 다른 풀이 방법을 찾다가 Counter 클래스를 사용하여 작성한 코드입니다. 본 강의에서는 카운터가 동일한 경우, 기존의 값을 변경하지 않는 방식이라 i가 출력되지만, 해당 방법을 사용하면 입력 순으로 o가 출력됩니다.

이 경우 최빈값을 찾아내는 코드는 맞지만, 값이 동일한 경우에 처리하는 로직이 다르기 때문에 발생한다고 이해하면 될까요?

답변해주신다면 감사하겠습니다.

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 dkw gh 님! 좋은 질문 감사합니다 ㅎㅎ

두 코드가 다른 값을 반환하는 이유는 동일한 빈도의 알파벳이 존재할 때, 최댓값을 판단하는 기준이 다르기 때문입니다.

차이점 분석

첫 번째 코드 (Counter 기반 코드):

  1. Counter는 입력된 문자열의 문자 순서를 유지하며, 각 알파벳의 개수를 세는 딕셔너리 형태로 동작합니다.

  2. max(counter, key=counter.get)동일한 빈도의 문자가 여러 개일 때, 먼저 등장한 문자를 반환합니다.

두 번째 코드 (수동 탐색 코드):

  1. 모든 알파벳(a-z)을 순회하면서 입력 문자열에서 해당 알파벳의 개수를 직접 계산합니다.

  2. max_occurrence 값이 갱신될 때만 max_alphabet을 업데이트합니다.

  3. 알파벳 배열을 a-z 순서로 순회하므로, 동일 빈도의 문자가 존재하면 사전 순으로 가장 앞에 있는 알파벳이 반환됩니다.

 

즉, 동일한 빈도일 경우 반환하는 알파벳의 순서 로직이 다르기 때문에 발생한 경우라고 보시면 됩니다! 따라서 좋은 코드를 작성해주셨지만, 구현 방향성에 따라 다른 것이기 때문에 다른 값이 나왔다. 올바른 코드다 라고 봐주시면 될 것 같습니다!

0

안녕하세요, 인프런 AI 인턴입니다. dkw gh님.

질문해주신 내용은 최빈값을 찾을 때 동일 값 처리의 차이에 대한 것입니다.

주석 처리된 코드와 Counter 클래스를 활용한 코드는 둘 다 문자열에서 가장 많이 발생하는 문자를 찾는 기능을 수행합니다.

차이점 설명

  1. 직접 구현 방식 (주석 처리 코드):

    • 알파벳 배열을 초기화하고 문자열을 순회하여 각 알파벳의 발생 빈도를 저장합니다.
    • 두 단계로 나누어 최대 빈도 수와 그 값을 찾습니다.
    • 이 코드에서는 동일한 빈도의 값이 존재할 때 가장 먼저 높은 빈도에 도달한 알파벳이 유지됩니다.
  2. Counter 클래스 이용:

    • Counter 객체를 사용해 자동으로 각 문자 빈도를 계산합니다.
    • max(counter, key=counter.get)를 이용하여 가장 빈도가 높은 문자를 반환합니다.
    • 동일한 빈도의 문자가 있을 경우, Counter는 입력 순서대로 저장하기 때문에 입력 순서상 먼저 등장한 문자가 반환됩니다.

이 차이가 발생하는 이유는 Counter 클래스가 동등한 빈도를 가진 문자들 중 처음 등장한 것을 반환하도록 설계되었기 때문입니다. 따라서, 코드를 작성할 때 어떤 상황에서 어느 방식이 더 적합할지를 염두에 두시면 좋습니다.

관련 내용에 대한 기존 질문과 답변은 아래 링크에서 더 찾아보실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dkw gh님의 프로필 이미지
dkw gh

작성한 질문수

질문하기