티스토리 뷰

문제

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

풀이과정

1차원 배열에서 각각 다른 원소를 가리키고 있는 2개의 포인터를 조작해가며 원하는 것을 얻는 기법인 투 포인터(two pointers) 문제다.

left ~ right 구간의 합을 확인하면 된다.

(93%,1초) 에서 “틀렸습니다”가 떴다. 왜 그런가 찾아봤더니 한 가지 예외처리를 해줘야되는 문제였다.

만약 left+1 이 right보다 커질 경우에는 left와 right의 자리를 바꿔줘야된다.

소스코드


#include <iostream>



using namespace std;



#define MAX_N 10001



int n, m;

int a[MAX_N];

int ans;



void solution()

{

    int left = 0, right = 0,now_Sum=a[0];



    while (left <= right && right < n)

    {

        // 현재 구간의 합이 m과 같을 경우 

        // right += 1

        if (now_Sum == m)

        {

            ans += 1;

            right += 1;

            now_Sum += a[right];

        }

        // 현재 구간의 합이 m보다 클 경우

        else if (now_Sum > m)

        {

            now_Sum -= a[left];

            left += 1;



            // left가 right보다 커진 경우 바꿔준다

            if (left > right && left < n)

            {

                right = left;

                now_Sum = a[left];

            }

        }

        // 현재 구간의 합이 m보다 작을 경우

        else if (now_Sum < m)

        {

            right += 1;

            now_Sum += a[right];

        }

    }

}

int main()

{

    ios::sync_with_stdio(false);

    cin.tie(0); cout.tie(0);



    cin >> n >> m;



    for (int i = 0; i < n; i++)

    {

        cin >> a[i];

    }



    solution();



    cout << ans << "\n";



    return 0;

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 14503번 로봇 청소기  (0) 2018.04.07
[백준] 14502번 연구소  (0) 2018.04.07
[백준] 1182번 부분집합의 합  (0) 2018.04.06
[백준] 1987번 알파벳  (0) 2018.04.06
[백준] 2580번 스도쿠  (0) 2018.04.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함