백준 1316번 파이썬

syeony·2024년 5월 27일
0

python

목록 보기
6/20

내가 제출한 코드

a=int(input())
b=[]

for i in range(a):
    b.append(input())

count=len(b)

for i in range(a):
    if(len(b[i])>2):
        temp=0
        for j in range(len(b[i])):
            for x in range(j, len(b[i])):
                if(b[i][j]==b[i][x]):
                    if(abs(x-j)>1 and b[i][j]!=b[i][x-1]):
                        temp+=1
        if(temp>0):
            count-=1
    else:
        pass
            
print(count)

나는 count라는 변수를 단어의 개수로 설정하고 조건을 만족할때마다 하나씩 빼는 형식으로 짜보았다.

첫번째 for문은 단어의 개수,
if문은 단어자릿수가 3부터 본다는 소리이고,
여기서 temp변수를 선언하고,
두번째 for문은 단어 자릿수,
세번째 for문도 단어 자릿수이다.

여기서 두번째, 세번째 for문에서 버블정렬식으로 하나씩 문자열을 비교하여 만약 문자열이 같다면,
두번째 if문으로 이동하여 x와 j의 차이가 1보다 크면서 j와 x-1자리의 문자열이 다를때 temp + 1 을 해준다.

i번째 문자열을 다 돌고 나오면 temp가 0보다 클때 count에서 1을 빼준다.

처음엔 감을 잡기 힘들었지만, 필기하면서 해보라는 친구의 조언에 패드에 필기하면서 조건을 다시 정리하고, 이동하는 중 내내 이 문제에 대해 생각하면서 풀 수 있었다.

다른사람 코드

N = int(input())
cnt = N

for i in range(N):
    word = input()
    for j in range(0, len(word)-1):
        if word[j] == word[j+1]:
            pass
        elif word[j] in word[j+1:]:
            cnt -= 1
            break

print(cnt)

나보다 훨씬 간결한 코드...
이 사람은 for문을 두번만 썼다.

나는 b리스트를 만들어 거기다 단어들을 모두 저장 후에 for문으로 들어갔는데, 여기서는 바로 for문으로 들어가 단어 하나 입력할때마다 조건을 만족하면 cnt를 -1하는 식으로 되어있었다.
그래서 for문을 두개만 쓸수 있던거구나...천재다!!

그래서 2차배열이 아닌 1차배열로 문자열을 비교할 수 있고,
코드가 더욱 간결해졌다.

그리고 word[j]와 word[j+1]로 비교하기 위해서 애초에 for문 범위를 len(word)-1까지로 잡은 것도 알게되었다. 나도 처음에 j와 j+1로 비교하고싶었는데 나는 범위를 len(word)까지 잡아서 계속 배열범위초과 에러가 떠서 j,j-1 이런식으로 비교할수밖에 없었는데...

그리고 조건을 나는 매우 복잡하게..여러개 잡아서 다 집어넣는식으로 짰는데 이 코드는 조건이 매우 간단명료했다.
1. 연달아 있는 문자열이 같으면 pass
2. 연달아 있는 문자열이 아니면서 j+1이후의 문자열에 j문자열이 있다면 cnt-1

배운것

  1. 입력으로 첫째줄에 단어갯수, 둘째줄부터 단어가 들어오는 문제의 경우, 단어를 리스트에 저장하지 않고 바로 for문에 넣어 처리할 수 있다.
  2. break를 쓰면 if문만 빠져나가는게 아니라 for문도 같이 빠져나간다
profile
모바일 어플리케이션, cross platform과 iOS에 관심이 많은 개발자 오승연입니다

0개의 댓글