ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_25916_싫은데요 (python)
    카테고리 없음 2023. 7. 10. 22:34

    ★ 접근

    데이터가 주어지고 문제 조건 상 데이터를 다시 정렬할 수 없다. 투 포인터를 활용해야 한다는 것을 알 수 있다.

     

    ★ 풀이 

    1. n이 1일 수도 있으니 조건문을 써준다.

    2. n이 2 이상이라면 temp에 data[l]을 일단 더하는데 while문 안에 들어가서 r이 작다면 더하면서 앞으로 가면 되고 크다면 바로 l을 빼주면 되기 때문에 아무 조건 없이 data[l]을 더하면 된다. (처음에 필자는 data[l]이 m보다 작으면 더하고 크면 작는 경우가 나올 때까지 l과 r을 증가시키면서 찾았다.)

     

    - 코드

    import sys
    input = sys.stdin.readline
    n,m = map(int,input().split())
    data = list(map(int,input().split()))
    if n == 1:
        if data[0] > m:
            print(0)
        else:
            print(data[0])
    else:
        temp = 0
        ans = 0
        l,r = 0,1
        temp += data[l]
        while l <= r and r < n: 
            if data[r] <= m - temp: # 만약 data[r]보다 크거나 같아 그럼 더할 수 있는거니까
                temp += data[r] # 더해
                r += 1# 그리고 r만 증가시켜
            else: # 근데 만약 data[r]이 더 크면 l을 빼야지
                if l == r: # l이 r과 같다는 의미는 현재 idx가 혼자만으로도 너무 크니까
                    l += 1 #l,r을 하나씩 증가시키고 temp도 0으로 만들어
                    r += 1
                    temp = 0
                    continue
                temp -= data[l] #temp에서 data[l]을 빼
                l += 1 # l을 1증가시
            ans = max(ans,temp)
        print(ans)

     

    ★ 회고

     처음에 투 포인터인 것을 알았지만 다른 방법으로 풀어보고 싶어서 했다가 바로 틀렸다. 다시 투 포인터로 돌아왔지만 처음에 while 반복문을 들어가기전에 temp에 += data[i] 과정에서 많이 헤맸다. temp에 막 더하면 안 된다고 생각했기 때문에 여러 조건문을 걸었다가 먼 길을 돌아왔다. 결국 정답은 어떠한 조건도 걸지 않은 것이었고 평소였으면 후딱 끝냈을 문제였는데 아쉽다. 집중해서 풀어보자!

Designed by Tistory.