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
