본문 바로가기
코딩 테스트

[백준][python] 1157.단어공부 -문자열

by 카프리썬 2021. 6. 10.
728x90

아래의 문제는 '백준'의 알고리즘 문제 내용이며 코드는 직접 푼 내용입니다.


 

 

1157. 단어공부


문제 및 입출력 

입출력예시 


나의시도

dict를 가지고 이러쿵저러쿵 해보려고 했다. 

그래서 {문자열 : 횟수}의 dict를 만들고 여기에서 조건에 맞게 하나하나씩 해결해갔지만 넘 노가다여서 시간초과. 

 

결과

s=input()
S=list(s.upper())
dict={}
#dict {문자열 : 횟수}
for str in S:
    dict[str]=S.count(str)
#print(dict)
#가장 큰 count값 가져오기
max=0
for key, value in dict.items():
    if max<value:
        max=value
#print(max)
#가장 큰 count값이 있는 key(result)가져오기
count=0
for key,value in dict.items():
    if max==value:
        count=count+1
        #print(key,value)
        result=key
#print(count)
#max count값이 2개이상이면 ? 출력, 아니면 그 result 
if count>=2:
    print('?')
else:
    print(result)

 


풀이과정

  • is.upper() : 대소문자 상관없이 가장 많이 사용된 문자열을 알기 위해 모든문자열을 대문자로 통일 시켰다. 
  • dict={} : 각 문자열마다 몇번씩 나왔는지 알기 위해 key,value형식이 필요하다고 생각했다.
  • dict[str]=S.count(str) : 리스트안에서 각각의 문자열 str이 몇번 나왔는지를 value로 넣기 위해 count를 썻다. 

여기까진 좋았다. 근데 count와 max를 구하는게 비효율적이라고 느껴졌다.

그래서 조금더 코드를 바꾸었따. 하지만 그래도 여전히 '시간초과'인것! 

s=input()
S=list(s.upper())
dict={}
#dict {문자열 : 횟수}
for str in S:
    dict[str]=S.count(str)
#print(dict)
#가장 큰 count값 가져오기
max=0
result=0
for key, value in dict.items():
    if max<value:
        max=value
        result=key
    elif max==value:
        result='?'
print(result)

 

그렇다면 시간초과의 원인이 혹시 'count'인 것일까? 해서 if문으로 변경했다.

그랬더니 통과했다..휴..

s=input()
S=list(s.upper())
dict={}
#dict {문자열 : 횟수}
for str in S:
    if str in dict:
        dict[str]+=1
    else:
        dict[str]=1
#print(dict)
#가장 큰 count값 가져오기
max=0
result=0
for key, value in dict.items():
    if max<value:
        max=value #가장큰 count값 max로 가져오기
        result=key #가장큰 count값이면 그때 key가져오기
    elif max==value: #또 한번 가장큰값과 같다? 그럼 중복인경우!
        result='?'
print(result)

 

놀랍게도 처음에 작성했던 나의 구닥다리 코드에서 count 대신 위와 같은 방법으로 작성해도 통과과 되긴 된다..

시간은 10초정도밖에 차이가 나지 않는다..

덧붙여 dict.items()로 딕셔너리를 검색하는 것 보다

for i in dict:로 해서 key=i, valvue=key[i] 로 받는게 메모리를 덜 쓰는듯 했다. 

 

배운점

  • count를 직졉 사용하면 속도가 느려진다, 대신 if로 문자열 검색을 하자.
  • dict를 검색할땐 key,value보다 i, dict[i] 형태가 메모리를 덜 쓴다.

참고 

참고한 블로그 링크

https://velog.io/@sch804/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%B1%EC%A4%80-1157%EB%B2%88-%EB%8B%A8%EC%96%B4-%EA%B3%B5%EB%B6%80

 

아래의 문제는 '백준'의 알고리즘 문제 내용이며 코드는 직접 푼 내용입니다.


 

1157. 단어공부


문제 및 입출력 

입출력예시 


나의시도

dict를 가지고 이러쿵저러쿵 해보려고 했다. 

그래서 {문자열 : 횟수}의 dict를 만들고 여기에서 조건에 맞게 하나하나씩 해결해갔지만 넘 노가다여서 시간초과. 

 

결과

s=input()
S=list(s.upper())
dict={}
#dict {문자열 : 횟수}
for str in S:
    dict[str]=S.count(str)
#print(dict)
#가장 큰 count값 가져오기
max=0
for key, value in dict.items():
    if max<value:
        max=value
#print(max)
#가장 큰 count값이 있는 key(result)가져오기
count=0
for key,value in dict.items():
    if max==value:
        count=count+1
        #print(key,value)
        result=key
#print(count)
#max count값이 2개이상이면 ? 출력, 아니면 그 result 
if count>=2:
    print('?')
else:
    print(result)

 


풀이과정

  • is.upper() : 대소문자 상관없이 가장 많이 사용된 문자열을 알기 위해 모든문자열을 대문자로 통일 시켰다. 
  • dict={} : 각 문자열마다 몇번씩 나왔는지 알기 위해 key,value형식이 필요하다고 생각했다.
  • dict[str]=S.count(str) : 리스트안에서 각각의 문자열 str이 몇번 나왔는지를 value로 넣기 위해 count를 썻다. 

여기까진 좋았다. 근데 count와 max를 구하는게 비효율적이라고 느껴졌다.

그래서 조금더 코드를 바꾸었따. 하지만 그래도 여전히 '시간초과'인것! 

s=input()
S=list(s.upper())
dict={}
#dict {문자열 : 횟수}
for str in S:
    dict[str]=S.count(str)
#print(dict)
#가장 큰 count값 가져오기
max=0
result=0
for key, value in dict.items():
    if max<value:
        max=value
        result=key
    elif max==value:
        result='?'
print(result)

 

그렇다면 시간초과의 원인이 혹시 'count'인 것일까? 해서 if문으로 변경했다.

그랬더니 통과했다..휴..

s=input()
S=list(s.upper())
dict={}
#dict {문자열 : 횟수}
for str in S:
    if str in dict:
        dict[str]+=1
    else:
        dict[str]=1
#print(dict)
#가장 큰 count값 가져오기
max=0
result=0
for key, value in dict.items():
    if max<value:
        max=value #가장큰 count값 max로 가져오기
        result=key #가장큰 count값이면 그때 key가져오기
    elif max==value: #또 한번 가장큰값과 같다? 그럼 중복인경우!
        result='?'
print(result)

 

놀랍게도 처음에 작성했던 나의 구닥다리 코드에서 count 대신 위와 같은 방법으로 작성해도 통과과 되긴 된다..

시간은 10초정도밖에 차이가 나지 않는다..

덧붙여 dict.items()로 딕셔너리를 검색하는 것 보다

for i in dict:로 해서 key=i, valvue=key[i] 로 받는게 메모리를 덜 쓰는듯 했다. 

 

배운점

  • count를 직졉 사용하면 속도가 느려진다, 대신 if로 문자열 검색을 하자.
  • dict를 검색할땐 key,value보다 i, dict[i] 형태가 메모리를 덜 쓴다.

참고 

참고한 블로그 링크

https://velog.io/@sch804/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%B1%EC%A4%80-1157%EB%B2%88-%EB%8B%A8%EC%96%B4-%EA%B3%B5%EB%B6%80

 

반응형