1 minute read


할 일

알고리즘 문제풀이

boj 1976 - 여행가자

py solution

인덱싱 문제로 여러번 틀림. 첫 번째 값의 그룹을 구할 때에도 -1을 해주어야 한다는 것을 잊었다.


def solve():
    n = ria()[0]
    m = ria()[0]
    p = [-1]*(n+10)
    mat = []
    for r in range(n):
        mat.append(ria())

    path = ria()

    def find(k):
        if(p[k] < 0):
            return k
        p[k] = find(p[k])
        return p[k]

    def merge(a, b):
        A = find(a)
        B = find(b)
        if(A != B):
            p[B] = A

    for r in range(n):
        for c in range(n):
            if(mat[r][c] == 1):
                merge(r, c)

    firstValue = find(path[0]-1) # indexing 주의..

    for i, v in enumerate(path):
        if(find(v-1) != firstValue):
            print('NO')
            return
    print('YES')
    pass

boj 1806 - 부분합

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

투포인터 종료처리를 좀더 깔끔하게 생각하는 방법을 모르겠다. 아직을 볼 때마다 헷갈린다.

py solution

def solve():
    n, s = ria()
    curmin = 1000000009
    curminlen = 1000001
    cursum = 0
    arr = ria()
    diffs = [arr[0]]*(n+1)

    for i in range(n-1):
        diffs[i+1] = arr[i+1]-arr[i]
    it(diffs)

    right = 0
    left = 0
    cursum = 0
    # l~r 합 인덱싱을 어떻게 해야 깔끔하게 유지되나?
    # 같은 위치를 가리킬때 합이 0으로 생각
    # 0,0->0,   0,1->1

    while(True):
        # it(left, right, cursum)
        if(cursum >= s):
            curminlen = min(curminlen, right-left)
            curmin = min(curmin, cursum)
        if(cursum < s):
            if(right >= n):
                break
            cursum += arr[right]
            right += 1
        elif(cursum == s):
            if(right >= n):
                break
            if(left >= n):
                break
            cursum += arr[right]
            cursum -= arr[left]
            left += 1
            right += 1
        else:
            if(left >= n):
                break
            cursum -= arr[left]
            left += 1

    while(cursum >= s):
        # it(left, right, cursum)
        curminlen = min(curminlen, right-left)
        curmin = min(curmin, cursum)
        if(left >= n):
            break
        cursum -= arr[left]
        left += 1
    it(curmin, curminlen)
    if(curmin >= 1000000009):
        print(0)
        return
    print(curminlen)
    pass

boj 14868 - 문명

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


Comments