Breaking

2019년 1월 7일 월요일

Baekjoon 1316 그룹 단어 체커 python

Baekjoon 1316 그룹 단어 체커 python





https://www.acmicpc.net/problem/1316

직관적 풀이


N=int(input())
getStr=[]
for i in range(N):
    getStr.append(input())
    
countGroupNum=0

for j in range(N):
    alpDict={chr(i):0 for i in range(ord('a'),ord('z')+1)}
    seealp=list(set(getStr[j]))
    for i in range(len(getStr[j])):        
        if len(seealp) == len(getStr[j]): #길이와 숫자가 같다 = 서로 다른 알파벳 가지고 있다
            countGroupNum +=1
            break
        if alpDict[getStr[j][i]] != 0 and i>0 and getStr[j][i] != getStr[j][i-1]: #알파벳 사전에 있지만 연속적이지 않은 알파벳
            break    
        if i == len(getStr[j])-1 and alpDict[getStr[j][i]] == 0:#마지막 알파벳일 때 
            countGroupNum +=1   
            break
        elif i == len(getStr[j])-1 and getStr[j][i] == getStr[j][i-1]:
            countGroupNum += 1
            break
            
        if alpDict[getStr[j][i]] == 0:
            alpDict[getStr[j][i]] +=1  
            
print(countGroupNum)

직관적 풀이의 장점은 생각이 가는대로 만들어볼 수 있다는 점이지만 이와 같은 문제에서 if문이 기하급수적으로 늘어갈 수 있다는 단점이 있다.

더욱이 코드상으로 참인 명제를 찾는 것보다 거짓인 명제를 찾는 것의 숫자가 적다는 사실을 깨닫게 된다.

내가 생각하는 이 문제의 핵심은

단어 속 알파벳이 연속이냐 
+
연속이 아니라면 뒤에 나온적이 있는지이다.

새롭게 찾은 방법 1


우선 코드 길이도 줄이고 조건문을 적게 사용해보자!

N=int(input())    
countGroupNum=0
for j in range(N):
    getStr=input()
    seealp=[]
    seealp.append(getStr[0])
    if len(getStr) == 1:
        countGroupNum+=1
        
    for i in range(1,len(getStr)):    
        if getStr[i] != getStr[i-1]:
            if getStr[i] in seealp:
                break
            else:
                seealp.append(getStr[i])
                
        if i == len(getStr)-1:
            countGroupNum+=1
                        
print(countGroupNum)

seealp 리스트에 단어 알파벳을 넣어가며 연속이 아니면서 다음 단어에 존재하지 않을 때만 seealp라는 곳에 넣는 방법을 강구해봤다.

그러나 이것조차도 필요없다는 사실을 깨닫게 되었다.

새롭게 찾은 방법 2


N=int(input())    
countGroupNum=0
for j in range(N):
    getStr=input()
    
    if len(getStr)==1:
            countGroupNum+=1
            
    for i in range(len(getStr)-1):    
        if getStr[i] != getStr[i+1]:
            if getStr[i] in getStr[i+1:]:
                break
                
        if i == len(getStr)-2:
            countGroupNum+=1
                        
print(countGroupNum)


나의 최종 답안은 이 코드이다.

군더더기를 없애고 최대한 줄여봤지만 더 줄일 수 있을 것 같다.



ALL RIGHT RESERVED TWINSTARINFO