알고리즘 백준 문제1157번

백준 문제 1157

문제는
1. 1부터 1,000,000자리 까지의 문자열 입력이 가능하고,
2. 대문자와 소문자만 입력가능,
3. 입력받은 문자 중 최빈값을 대문자로 출력
4. 만약 최빈값이 여러문자에 존재한다면 "?" 출력 ('babacba' 입력 시 => '?' 출력)
5. 대문자와 소문자는 별개 취급하지 않는다. ("baAbAcAa" 입력 시 => A를 5번으로 인식)

일단 시작은 이상한거 입력 못하게 해놓자! 라고 생각했고, 알고리즘 강의 때 들었던 26자리의 배열을 따로 선언한 후, 알파벳 별 빈도 수를 따로 만든 배열에 저장하면 될 것 같다고 생각했다.


string = input()
#알파벳 유효성검사
def check(string):
    for a in string:
        a = ord(a)
        if a > 122 or a < 65: 

            return False

    return True
#문자열 입력 유효성 검사
if check(string) == True and len(string) <= 1000000:

    countString = [0] * 26

    #대문자로 변환
    for a in string:

        a = ord(a)
        if 97 <= a <= 122:
            a -= 32  # turn to Capital

        a -= 65
        countString[a] += 1  ## 배열의 0번째는 A가 저장되고, 그 후 26번째 에는 Z가 저장됨


    mode = 0
    countMode = 0
    modeLocation = 0
    for i in range(len(countString)): #i번째 배열안에 있는 최빈값을 탐색

        if countString[i] > mode:
            mode = countString[i]


    for i in range(len(countString)): #최빈값을 가진 여러 문자가 있는지 확인
        if countMode > 1: #중복 되었으면 "?" 출력
            print("?")
            break

        elif countString[i] == mode: #중복되지 않았다면 최빈값의 위치값 저장
            countMode += 1
            modeLocation = i

    if countMode == 1: #최빈값을 가진 문자가 하나라면 해당 문자를 출력
        print(chr(modeLocation + 65)) 

이 코드를 쓰는데 반복문이 4개나 들어갔다.

문제를 맞추고 다른 사람들의 코드를 슬쩍 보았다.

다른사람이 쓴 코드 1

s,a=input().lower(),[]          #s 엔 인풋값을 **소문자로** , a 에는 빈 배열을 입력받아 할당한다.
for i in range(97,123):
 a.append(s.count(chr(i)))       #입력받은 애들의 수를 a 배열에 입력한다.
print('?'if a.count(max(a))>1 else chr(a.index(max(a))+97).upper())
# 배열에 있는 최대값의 갯수가 1개이상일때 ? 를 , 그외엔 대문자로 upper하여 출력한다.

count함수 안에 max 함수가 쓰여서 시간복잡도는 O(N^2) 이다.

다른사람이 쓴 코드 2

word = input().upper()   ## 대문자로 아예 입력을 받는다 
abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  ##입력값과 비교할 대문자 알파벳 문자열을 만든다
r = 0 
count = 0
for a in abc:
  temp = word.count(a)  # 입력값에 들어간 알파벳을 카운트
  if temp != 0:
    if r < temp:		# 알파벳을 카운트 한 값이 r 보다 크면 r에 저장, count엔 알파벳을 저장
      r = temp			# (알파벳 카운트 값이 r보다 작으면 그냥 다음 알파벳으로 넘어감)
      count = a
    elif r == temp:	  # 반복문을 끝까지 돌았는데도,r과 temp가 같다면 최빈값을 가진 문자가 여러개
      count = '?'
print(count)

비교 반복문 안에 count함수가 쓰여서 시간복잡도는 O(N^2) 이다.

난 반복문 4개를 썼고, 다른 사람의 코드는 이중 탐색(반복문)이 들어갔다.
난 이중 반복문을 최대한 안쓰려 했고, 파이썬의 문법을 많이 알지 못했던 것 같다.
내장 함수를 잘 쓰면 코드가 한결 보기 좋아지는 것 같다.

같은 값이면 계산이나 로직자체를 훨씬 단순화 시켜 설계하는게 좋은것 같은데, 영락없는 문송이들은 이게 쉽지가 않다. (요즘 나의 지능에 대한 의심을 하는 중이다)

소감
내가 쓴 코드는 시고르 자브종의 눈매마냥 멍청해 보인다.

매번 주석 단다고 한글키로 전환하는거 너무 너무 귀찮다.
그냥 영어에 익숙해지련다.
영어 잘하게 되면 , 그땐 포스팅도 영어로 해야지

좋은 웹페이지 즐겨찾기