백준

백준 1316번 (그룹 단어 체커2)

rabbit-jun 2025. 2. 7. 11:25

나의 풀이(틀림)

입력

3
ccazzzzbb
aabbbccb
kin
import sys
n =  int(sys.stdin.readline().strip())

chek=0

for i in range(n):
    group_cnt= 0
    judge =[0]
    word = sys.stdin.readline().strip()

    print(f'word: {word}, len: {len(word)}')
    for j,k in enumerate(word):
        if word.count(k) ==1:
            judge.append(0)
            print('len(judge)-1:', len(judge)-1)
            print(f'solo! j:{j}, k: {k}, judge: {judge}')
            print('!'*10)
            group_cnt+=1
        else :

            judge.append(j)
            print('len(judge)-1:', len(judge)-1)
            print('gc:', group_cnt)
            print('j:', j, 'k:', k)
            print('before judge[gc]:', judge[len(judge)-1])
            print('before judge[gc-1]:', judge[len(judge) -2])
            judge[len(judge)-1]= abs(judge[len(judge)-1] - judge[len(judge) -2])
            print('after judge[gc]:', judge[len(judge)-1])
            print('judge:', judge)
            print('-'*10)

            if (len(judge)-1+group_cnt)%2  ==0 and judge[len(judge)-1] == 1:
                judge[len(judge)-1]=0
                judge[len(judge)-2]=0
                print('reset')
                print('judge:', judge)
                print('-'*10)


    if len(judge) == judge.count(0):
        chek+=1

print(chek)

간략히 말하면 cn =cn -cn-1을 이용하여 풀기로 결정!
하여 list를 이용하여 cn-1을 사용할 수 있게 만들었다.

모든 리스트의 값이 모두 0이면 그룹 단어라고 판단!
알파벳의 개수가 한 개일 때도 리스트에 값을 추가하므로 len()을 이용하여 계산을 진행했다.
*이 때 python은 0부터 시작하므로 len()-1을 해야 한다.*

           if (len(judge)-1+group_cnt)%2  ==0 and judge[len(judge)-1] == 1:
                judge[len(judge)-1]=0
                judge[len(judge)-2]=0

는 2개씩 묶는게 포인트이므로 %2를 할 때 그리고 그때의 cn =1이면 cn, cn-1 을 0으로 만든다.
*주의!! (len(judge)-1+group_cnt) 알파벳이 하나일때 값을 추가했으므로 인덱스가 더 늘었났으니 group_cnt로 맞춰준다 *

그런데 다 만들고 보니 이거 또한 다른 그룹과 혼합된다.
분명 만들기 전에는 혼합되는걸 막아야 겠다고 생각했다.

그런데 생각을 하다 보니 어느새 cn=cn=cn-1에 매몰되서 어느 순간 이걸 구현하는데 맛이 가버린..

그냥 전의 코드를 리스트로 바꿨을 뿐인...

디버깅용 print()만 엄청 돌렸다... 하....

나의 풀이(틀림)

import sys
n =  int(sys.stdin.readline().strip())

chek=0
for i in range(n):
    judge =[0]
    word = sys.stdin.readline().strip()
    group_cnt= 0
    values=['']
    print(f'word: {word}, len: {len(word)}')
    for j,k in enumerate(word):
        values.append(k)
        if word.count(k) ==1:
            judge.append(0)
            print('len(judge)-1:', len(judge)-1)
            print('gc:', group_cnt)
            print(f'solo! j:{j}, k: {k}, judge: {judge}')
            print('!'*10)
            group_cnt+=1
        else :
            judge.append(j)
            print('len(judge)-1:', len(judge)-1)
            print('gc:', group_cnt)
            print('j:', j, 'k:', k)
            print('before judge[gc]:', judge[len(judge)-1])
            print('before judge[gc-1]:', judge[len(judge) -2])
            print('values:',values , 'values:', values[len(judge)-2])
            if k == values[len(judge)-2]:
                print('cal')
                judge[len(judge)-1]= abs(judge[len(judge)-1] - judge[len(judge) -2])
            print('after judge[gc]:', judge[len(judge)-1])
            print('judge:', judge)
            print('-'*10)


            if (len(judge)-1+group_cnt)%2  ==0 and judge[len(judge)-1] == 1:
                judge[len(judge)-1]=0
                judge[len(judge)-2]=0
                print('reset')
                print('judge:', judge)
                print('-'*10)


    if len(judge) == judge.count(0):
        chek+=1

print(chek)

핵심은 values=['']로 값들을 한데 모아둔다

     if k == values[len(judge)-2]:
                judge[len(judge)-1]= abs(judge[len(judge)-1] - judge[len(judge) -2])

그리고 지금의 알바파벳과 이전의 알파벳이 같으면 계산한다는 조건문을 추가!!!!
이때 values의 0번째 값은 빈칸으로 해둬야 한다. 그렇지 않으면 len(judge)-2 과 k의 값이 항상 같다

머릿속에서 딕셔너리를 써서 value에 알파벳을 넣고 같은 것끼리 인덱스 번호로 계산하는 과정을 짜다가 불현듯 생각났다.

그러나 틀렸다....

문제는 같은 단어가 연속으로 홀수번 나오면 reset이 안된다...
즉, len(judge)-1+group_cnt)%2 ==0이 수행이 안되는 것

나는 바보다
judge[len(judge)-1]는 결국 j와 값이 같다. 왜냐하면 j는 인덱스 값이고 그 값을 리스트에 추가했으니 둘은 같은 값이다.

나의 풀이(디버깅용)

import sys
n =  int(sys.stdin.readline().strip())

chek=0
for i in range(n):
    judge =[0]
    word = sys.stdin.readline().strip()
    values=['']
    print(f'word: {word}, len: {len(word)}')
    for j,k in enumerate(word):
        values.append(k)
        if word.count(k) ==1:
            judge.append(0)

            print(f'solo! j:{j}, k: {k}, judge: {judge}')
            print('!'*10)
 
        else :
            judge.append(j)

            print('j:', j, 'k:', k)
            print('values:',values , 'values:', values[j])
            print('bfore judge:', judge)
            print('before j-1:', j-1)
            if k == values[j]:
                print('cal')
                judge[j+1]= abs( j - (j-1))

            print('after judge:', judge)

            print('-'*10)


            if judge[j+1] == 1:
                judge[j]=0
                judge[j+1]=0
                print('reset')
                print('judge:', judge)
                print('-'*10)


    if len(judge) == judge.count(0):
        chek+=1

print(chek)

역시 기호는 간단할 수록 이해하기 편하다 괜히 있어보이게 한다고  쓸데 없는 자원을 낭비했다.

이번의 핵심은 grop_cnt의 제거 및 계산 부분의 내용 수정이다

            if k == values[j]:
                judge[j+1]= abs( j - (j-1))

 

반응형