알고리즘 백준 문제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개를 썼고, 다른 사람의 코드는 이중 탐색(반복문)이 들어갔다.
난 이중 반복문을 최대한 안쓰려 했고, 파이썬의 문법을 많이 알지 못했던 것 같다.
내장 함수를 잘 쓰면 코드가 한결 보기 좋아지는 것 같다.
같은 값이면 계산이나 로직자체를 훨씬 단순화 시켜 설계하는게 좋은것 같은데, 영락없는 문송이들은 이게 쉽지가 않다. (요즘 나의 지능에 대한 의심을 하는 중이다)
소감
내가 쓴 코드는 시고르 자브종의 눈매마냥 멍청해 보인다.
매번 주석 단다고 한글키로 전환하는거 너무 너무 귀찮다.
그냥 영어에 익숙해지련다.
영어 잘하게 되면 , 그땐 포스팅도 영어로 해야지
Author And Source
이 문제에 관하여(알고리즘 백준 문제1157번), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wanos/알고리즘-백준-문제1157번저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)