본문 바로가기

백준 파이썬 코딩

백준 1195 킥다운 파이썬 최적화 X

https://www.acmicpc.net/problem/1195

 

1195번: 킥다운

첫 줄에는 첫 번째 기어 파트를 나타내는 1과 2로 구성된 문자열이 주어진다. 두 번째 줄에는 마찬가지로 두 번째 기어 파트를 나타내는 1, 2로 구성된 문자열이 주어진다. 여기서 1은 홈을, 2는

www.acmicpc.net

처음 문제를 봤을때 두개의 문자열을 움직여가며 비교해야겠다고 생각했다.

긴 문자열을 기준으로 작은 문자열이 좌로 움직이는 것이다. 하지만 작은 문자열을 옆으로 이동하면서 긴 문자열과 하나씩 비교하면 긴 문자열의 index범위를 벗어나게 되어 오류가 발생한다.

이러한 점을 해결하기 위해 try 구문을 써서 index범위를 벗어나면 반복을 종료하는 코들를 구성해봤다.

a = input()
b = input()
if int(a)<int(b):
    a ,b = b,a
at =len(a)
bt = len(b)
e =0
for i in range(len(a)):
    c = 0
    t=0
    for j in range(len(b)):
        try:
            if a[i+j] == '2' and b[j]=='2':
                t=1
                break
            else:
                c+=1
        except:
            break
    if c == bt:
        e =1
        print(at)
        break
    if t==0:
        break
if t ==0 and e==0:
    print(at+len(b)-c)

하지만 결과는 틀렸습니다 였고 반례를 찾던중

211
221 

답 : 4  오답: 5가 나오는 것을 확인했고 문자열의 비교가 양방향으로 이루어 지지안고 단방향으로 이루어져 오류가 발생함을 깨달았다.

그래서 위의 코드를   a와 b를 바꿔서 다시 한번 진행 시켜줌으로써 양방향으로 비교가 이루어지게 만들어 주고 코드를 살짝 깔끔하게 정리하고 제출했는데 15%부분에서 틀렸습니다를 받았다. 아래는 문제가 됐던 반례이다.

2112
222

답: 7

위의 경우에는 두개의 문자열이 겹칠 수 없는 상태이다. 그래서 4+3인 7이 정답이다.

아래는 AC받은 코드이다.

a = input()
b = input()
if int(a)<int(b):
    a ,b = b,a
at =len(a)
bt = len(b)
e =0
re =10**5
for i in range(len(a)):
    c = 0
    t=0
    for j in range(len(b)):
        try:
            if a[i+j] == '2' and b[j]=='2':
                t=1
                break
            else:
                c+=1
        except:
            break
    if c == bt:
        e =1
        re =min(re,at)
        break
    if t==0:
        re = min(re,at+len(b)-c)

e=0
for i in range(len(b)):
    c = 0
    t=0
    for j in range(len(a)):
        try:
            if b[i+j] == '2' and a[j]=='2':
                t=1
                break
            else:
                c+=1
        except:
            break
    if c == bt:
        e =1
        re =min(re,at)
        break
    if t==0:
        re = min(re,bt+len(a)-c)

if re==10**5:
    print(bt+at)
else:
    print(re)

도움이 되셨으면 공감 버튼 한번만 눌러주세요.

다음에는 코드를 더 깔끔하게 만들어서 올려보겠습니다.