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