For Programmer

백준 1316번 파이썬 문제풀이(문자열:그룹 단어 체커) 본문

코팅테스트/백준 문제 모음

백준 1316번 파이썬 문제풀이(문자열:그룹 단어 체커)

유지광이 2021. 9. 8. 16:42
728x90

n = int(input())
count = 0
for i in range(n):
    s = input()

    if len(s) == 1:  # s가 만약에 한자리면은 무조건 그룹단어이다.
        count += 1 #따라서 +1 해준다.
    else: #2자리 이상이라면
        for j in range(1, len(s)): #2번째 인덱스부터 마지막 인덱스까지
            if s[j - 1] == s[j]: #문자 두개씩 비교를 해서 만약 같다면
                pass #아무것도 하지않는다.
            elif s[j - 1] in s[j:]: #만약 문자 두개가 다르고 앞의 문자가 뒤 문자부터 마지막 인덱스 안에 또 등장한다면
                break #반복문을 빠져나간다.
            if j == len(s) - 1: #만약 위의 반복문 break없이 다돌고 마지막 인덱스까지 왔다면
                count += 1 #count +1 해준다.

print(count)

-> 이문제의 핵심포인트는 in 의사용과 s[j:] 로 새로운 리스트를 만들 수 있냐 없냐에 달려있다. 파이썬이 문자열에 강한이유도 이때문인데 : 를 이용하여 바로 해당인덱스 이후부터의 리스트 범위를 이용할 수 있다는것이 장점이다.

하지만 위 코드는 별로 좋지 못한 코드이다. 왜냐하면 if로 조건을 너무 많이 걸어주어야 하기 때문이다. 따라서 좋은 코드를 하나 소개하고자 한다. 다음은 count함수를 이용 했다.

 

n = int(input())
count = 0
for j in range(n):
    s = input()
    error = 0

    for j in range(len(s) - 1): # 문자열 마지막 인덱스 앞에까지 반복문 돌기 (두개씩 비교하기 때문)
        if s[j] != s[j + 1]: # 두 문자가 다르다면
            new_word = s[j + 1:] # 뒤 문자 부터 마지막 인덱스까지 새로운 리스트 만들기
            if new_word.count(s[j]) > 0: #새로만들어진 리스트에서 앞의 문자가 존재한다면 
                error += 1 #에러 값에 +1 해주고
                break #바로 반복문을 빠져나간다.
    if error == 0: #에러가 0이라면 (문자열이 1글자라도 처리가 가능 초기값을 0으로 세팅했기 때문에)
        count += 1 #그룹단어로 추가

print(count)

-> 두 문자가 같지 않을 경우 두번 째 문자부터 마지막 인덱스 까지 새로운 리스트를 만들어 바로 count로 앞의 문자가 또 등장한지 체크 하는 앞서 나온 코드와 비슷한 코드이지만 더 깔끔하다. 

728x90
Comments