파이썬 알고리즘 227번 | [백준 9024번] 두 수의 합 - 투포인터

Yunny.Log ·2022년 8월 5일
0

Algorithm

목록 보기
232/318
post-thumbnail

227. 두 수의 합

1) 어떤 전략(알고리즘)으로 해결?

  • 투 투루루루 투 포인터

2) 코딩 설명

<내 풀이>


import sys

t = int(sys.stdin.readline().strip())
for i in range(t) : 
    n,k = (map(int, sys.stdin.readline().rstrip().split()))
    lis = list(map(int, sys.stdin.readline().rstrip().split()))
    lis.sort()
    cnt = 0; save=k
    # S 에 속하는 서로 다른 두 개의 정수의 합이 
    # K 에 가장 가까운 두 정수
    # K 에 가장 가까운 두 정수의 조합의 수를 출력
    s,e = 0,n-1
    minim = 200000002
    while s<e : 
        cmp = lis[s] + lis[e]
############### 여기서 현재 cmp 가 차이가 가장 적게 나는 상탠지 검증 
        if minim > (abs(k-cmp)) : # 차이가 가장 적다면 
            minim = (abs(k-cmp)) # 얘로 갱신 
            cnt = 0 # cnt 초기화 (이제 이 차이값 기준으로 조합 세야해서 )
################################################################
        if cmp < k : # 너무 작아, k 가 되기엔 , so 좀 키워야 해 
            if (abs(k-cmp)) == minim : cnt+=1 
            # 근데 만약 얘가 minim 경우였다면 cnt 갱신
            s+=1

        elif cmp > k : # 너무 커, k 가 되기엔 , so 좀 줄여햐해 
            if (abs(k-cmp)) == minim : cnt+=1
            e-=1

        else : # 이거에 들어오면 (k랑 같아지면)
        # 무조건 얘 기준으로 minim 갱신되어있고
        # cnt 올려주면 됨 
            cnt+= 1
            s+=1

    print(cnt)


<반성 점>

  • 좀 더 투 포인터 익숙해질 필요 있어

<배운 점>

0개의 댓글