For Programmer

백준 1157번 파이썬 문제풀이(문자열 - 단어공부) 본문

코팅테스트/백준 문제 모음

백준 1157번 파이썬 문제풀이(문자열 - 단어공부)

유지광이 2021. 9. 3. 16:38
728x90

array = input()
countInfo = []
result = ""
upperArray = array.upper()  # array문자열을 모두 대문자로 변경

for j in range(ord("A"), ord("Z")+1): #A부터 Z까지  아스키코드 값으로 돌기
    for i in upperArray: #대문자로 변경한 문자열 접근
        if j == ord(i): #대문자로변경한 문자의 각 아스키코드 값이 A-Z의 아스키코드 값과 같다면
            countInfo.append([upperArray.count(i), j]) # 해당하는 아스키코드 값과 그것의 개수를 countInfo 이중 리스트에 저장
            #여기서 이중리스트에 첫번째 값은 항상 sort,max 등의 함수에 사용되기 때문에 count값을 첫번째 원소로 저장
            break #찾았을 경우 중복하지 않기 위해서 반복문을 빠져나온다.

result = chr(max(countInfo)[1]) #count의 값이 가장 큰 이중리스트의 2번째원소인 아스키코드를 다시 문자열로 변경하여 result값에 대입

for k in range(1,countInfo.__len__()):  # 세로크기(행의크기) 여기서 countinfo[0].__len__() 하게되면 열의크기(가로크기) 를 반환한다.
    countInfo.sort(reverse=True) #최댓값이 2개이상인지를 검사하기 위해 정렬수행(Max값이기 때문에 reverse를 주어 내림차순으로 정렬)
    if countInfo[k-1][0] == countInfo[k][0] and countInfo[k-1][0] == max(countInfo)[0] and countInfo[k][0] == max(countInfo)[0]:
        #2개의 원소의 값이 같고 그것이 최댓값과 같으면 최댓값이 2개이상이기 때문에 다음과 같은 조건을 만듬(단, 이조건은 정렬을 해야 만족할 수 있음)
        result = '?' #그럴경우 ?를 입력
        break # 2개의 원소가 이미 최댓값과 같다는 것은 그다음 원소를 탐색할 필요가 없기 때문에 바로 반복문을 빠져나온다.

print(result)

-> 각각의 코드 설명은 주석으로 처리 해놨으며 2중리스트를 이용하여 풀었다. 여기서 알아야할 점은 이중리스트의 첫번째 값은 sort,max 등의 함수의 인자로 이용되기 때문에 오름차순,내림차순,최댓값 등을 구하기 위해서는 이중리스트의 첫번째 원소로 넣으면 된다.

 

해당문제를 더 쉽게 푸는 방법이 존재한다. set함수를 이용하면 된다. 다음을 보자

words = input().upper()  # 입력을 대문자로 받는다.
unique_words = list(set(words))  # 입력받은 문자열에서 중복값을 제거

cnt_list = []  # 반복횟수를 담기 위한 리스트 초기화

for x in unique_words:  # 입력받은 문자 열에서 중복을 제거한 각각의 문자들을 사용
    cnt = words.count(x)  # 해당 단어들이 개수가 몇개있는지 체크
    cnt_list.append(cnt)  # 개수를 리스트에 append
    
if cnt_list.count(max(cnt_list)) > 1:  # 개수의 최대값이 중복되면
    print('?')  # ?를 출력
    
else:  # 그렇지 않을 경우
    max_index = cnt_list.index(max(cnt_list))  # count 숫자(개수의) 최대값 인덱스(위치) 를 찾는다.
    print(unique_words[max_index])  # 해당 인덱스에 있는 단어 출력

-> 주석으로 각각의 코드를 설명해 놨다.

728x90
Comments