백준 1316번 (그룹 단어 체커2)
나의 풀이(틀림)
입력
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))