[python 기초] 백준: 문자열1 (10809,1157,5622)

EMMA·2022년 2월 21일
0

[python] 백준 시리즈

목록 보기
7/14
post-thumbnail

함수를 많이 알고 함수와 for/while/if문 등을 잘 사용하면, 같은 답이라도 더 좋은 코드를 작성할 수 있다.


📍In a nutshell...

  • chr 함수와 ord 함수는 반대의 역할을 한다 (문자 <-> 유니코드)
  • 자료형 별 자주 쓰이는 함수들을 잘 기억해서 적절하게 사용하자
    • list형: append(), index(), count()
    • dic형: keys(), values(), items(), clear()
    • set형: add(), update(), remove()

#10809번
입력한 알파벳에 대해, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력하는 문제다. 포함되어 있지 않은 알파벳은 -1을 출력한다.

입력값은 알파벳 소문자로만 받는 것이 조건이므로, 유니코드를 활용해서 각 알파벳의 인덱스를 출력하기로 했다.

answer= input()

for code in range(97,123): 		#유니코드 상 a~z까지 해당
	if chr(code) in answer:		#chr함수: 해당 유니코드를 문자로 돌려줌
    	print(answer.index(char(code)))
	else:
    	print(-1)

#1157번
영단어를 입력했을 때, 가장 count가 많은 문자를 대문자 형태로 출력하되 그 문자가 2개 이상일 경우 "?"를 출력하면 된다. (e.g. Mississipi -> 4)

이 문제는 처음에 어렵지 않게 풀었으나 훨씬 더 런타임이 짧은 답안을 보고 꽤나 큰 충격(!)을 받았다. 일단 나는 입력값을 2개 변수에 선언해 listset으로 각각 만들고, for문을 사용해 서로 비교하며 문자 개수를 계산했다.

answer =input().upper()		#아예 처음부터 대문자로 만들어 버린다 

A = list(answer)
B = list(set(A))
num = []

for i in B:
	cnt = 0 
    for j in A:				#A에서 문장려 하나씩 꺼내 일치 여부를 확인한다 
    	if i == j:			#문자가 일치하는 경우 +1 카운트 한다 
        	cnt += 1
    num.append(cnt)
    
if num.count(max(num)) >=2:	#num에서 max값이 2개 이상일 때 "?" 출력
	print("?")
else:
	print(B[num.index(max(num))])

이렇게 해도 답은 맞는데, 시간이 다소 걸린다. 그런데 count함수를 사용하면 시간이 훨씬 단축된다. 이중 for문을 사용할 필요가 없기 때문이다.

answer =input().upper()		 

A = list(answer)
B = list(set(A))
cnt = []

for i in B:
	num = A.count(i)		#count 함수를 써서 총 개수를 바로 계산한다 
    cnt.append(num)
    
if cnt.count(max(cnt)) >=2:
	print("?")
else:
	print(B[cnt.index(max(cnt))])

#5622번
할머니는 전화를 걸때, 전화 번호 각 숫자에 해당하는 문자로 외운다. 예를 들어, UNUCIC는 868242다. 할머니가 외운 단어가 주어졌을 때, 전화를 걸기 위해서 필요한 시간을 구하는 문제다. 다이얼 1은 2초 걸리고, 다이얼 2부터는 +1초씩 걸린다.

이 문제의 경우, 각 알파벳에 매칭되는 숫자를 호출해서 각각 걸리는 시간을 모두 더하면 된다는 것까진 쉽게 그려졌다. 그런데 '알파벳:숫자'를 어떻게 매칭할 것인가를 좀 고민했다. 맨 처음엔 아래와 같이 함수를 만들어서 아주 원초적이고 무식한(...)방법으로 작성했다.

answer = input()

def alphabet(answer):
	if answer in ["A","B","C"]: return 3
	elif answer in ["D","E","F"]: return 4
	elif answer in ["G", "H", "I"] : return 5
	elif answer in ["J","K","L"] : return 6
	elif answer in ["M", "N", "O"]: return 7
	elif answer in ["P","Q","R","S"]: return 8
	elif answer in ["T","U","V"]: return 9
	elif answer in ["W", "X", "Y", "Z"]: return 10
    
dial_time = 0
for i in answer:
	dial_time += alphabet(i)

print(dial_time)

이렇게 작성하면, 나머지는 그냥 return값을 모두 더하면 끝이다. 문제는 쓸데없는 반복문들이 생기고 누가 봐도 전혀 효율적이지 않은, 좋지 않은 코드라는 것. 그래서 아예 알파벳 그룹 별로 나열해서 list로 묶고, 이중 for문을 통해 각 알파벳 그룹에서 해당 알파벳 포함 여부를 비교하면 된다.

answer = input()
dial = ["ABC","DEF","GHI","JKL","MNO","PQRS","TUX","WXYZ"]

dial_num  = 0 
for i in answer: 					#입력값에서 문자를 하나씩 꺼내서
	for j in range(len(dial)):		
    	if i in dial[j]:			#해당 문자가 dial[j]에 있으면
        	dial_num += (i+3)		#걸리는 시간을 계산한다 (다이얼 2는 3초)

print(dial_num)
            




출처:백준

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글