코드포스 풀이

코드포스 1633B 풀이

ag2개발자 2022. 2. 1. 03:39
n=int(input())

for _ in range(n):
    cnt1=0
    cnt2=0
    a=input()
    a= [x for x in a]
    x=a.count("1")
    y=a.count("0")
    if x==0 or y==0 or (x==1 and y==1):
        print(0)
    elif x==y:
        

        for i in range(1,len(a)):
            if a[-i]==a[-(i+1)]:
                cnt1+=1
                
                continue

            else:
                break
        for j in range(len(a)-1):
            if a[j]==a[(j+1)]:
                cnt2+=1
                
                continue

            else:
                break
                
        if cnt1>=cnt2:
            del a[-1]
            x1=a.count("0")
            y1=a.count("1")
            if x1>y1:
                print(y1)
            else:
                print(x1)
        else:
            del a[0]
            x2=a.count("0")
            y2=a.count("1")
            if x2>y2:
                print(y2)
            else:
                print(x2)
    else:
        if x>y:
            print(y)
        else:
            print(x)

어제 실행한 디비전2 B번 문제이다. 처음에 문제가 좀 이해하기 난해해서 애를 먹었는데, 어려운 문제는 아니었다.

주어진 문자열에서 부분 문자 열중에 1과 0이 더 적게 나온 것의 개수를 구하는 것인데,

물론 모든 부분 문자열을 탐색할 순 없다. 하지만 모든 경우의 수를 나누는 것 같긴 하다.

 

코드를 보면 테스트 케이스 n번을 입력받고 n번에 따라 for문을 돌려서 인풋 a를 받고 리스트 컴프리핸션을 이용했다. 1의 개수와 0의 개수를 x, y에 저장하고 경우의 수를 나누기 시작했다.

 

문제 조건에 따라 0이 없거나 1이 없거나 10, 01 이 두 경우는 모두 0을 프린트 해준다.

나머지는 그냥 문자열 전체를 부분 문자열로 보고 더 적게 나온 숫자의 개수를 프린트해주면 되는데...

개수가 같을 때가 상당히 까다롭다.

 

나는 개수가 서로 같을때 문자열 앞뒤로 몇 개나 같은 것들이 나오는지 cnt1 변수와 cnt2 변수로 세었고, 

cnt1 변수와 cnt2변수를 비교해서 0 혹은 1중 개수가 작은 것의 개수가 가장 크게 나와야 하므로 

뒤에나 앞에 하나를 지워줌으로써 다시 0과 1의 개수를 세서 적게 나온 숫자의 개수를 프린트해준다

 

'코드포스 풀이' 카테고리의 다른 글

코드포스 1512a 파이썬 풀이  (0) 2022.04.11
코드포스 339B 풀이  (0) 2022.01.31
코드포스 230A 풀이  (0) 2022.01.31
코드포스 131A 풀이  (0) 2022.01.31
코드포스 344A 풀이  (0) 2022.01.31