Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BOJ 2003 #21

Closed
java-saeng opened this issue Sep 3, 2021 · 7 comments
Closed

BOJ 2003 #21

java-saeng opened this issue Sep 3, 2021 · 7 comments

Comments

@java-saeng
Copy link

java-saeng commented Sep 3, 2021

강사님 안녕하십니까
강의 잘 듣고 있습니다 강의 덕분에 dp문제를 이제 좀 넉넉하게 푸는 것 같습니다!
다름이 아니라 두 포인터 강의를 듣고 2203문제를 푸는데 궁금한 점이 생겨 질문드립니다.

틀린 것

while (true) {

//            System.out.println(s + " " + e);
            //if와 else if 구분 잘해야함
            //sum < M할 때, sum += arr[e++] 해주면서 sum == K가 될 수 있음
            if(e == N) break;

            if(sum >= M){
                sum -= arr[s];
                s++;
            }
            else {
                sum += arr[e++];
            }

            if(sum == M){
                cnt++;
            }
            //왜 e == N일떄 멈춰도되나?
            //e가 잇는상태에서 s가 계속 가면서 답이 될 수 있지않을까?
            //절대 아니다. 왜냐하면 이미 Sum보다 작으면서 e == N이면
            //s가 늘어난다하면 당연히 뺄텐데 여기서 이미 sum보다 작은데 뺴면 더 작아지니까 답이 안됨 어차피

        }

맞은 것


 while (true) {

            //if와 else if 구분 잘해야함
            //sum < M할 때, sum += arr[e++] 해주면서 sum == K가 될 수 있음

            if(sum >= M){
                sum -= arr[s];
                s++;
            }
            else if(e == N){
                break;
            }

            else{
                sum += arr[e++];
            }
            
            if(sum == M){
                cnt++;
            }
        }

sout으로 s와 e의 좌표를 모두 찍어보고 손으로 다 해봤는데 왜 틀린지 모르겠습니다,,

그리고 혹시 두 포인터에서 중요한 부분은 범위 나누기일까요??
위 문제도 구글링해서 힌트를 얻은 것입니다.. 범위 나누는 데에 있어서 꼭 알아야 하는 부분이 있을까요?
강의 내용은 이해가 다 됐는데 막상 풀려고 하니 범위 나누기가 어렵습니다.

@rhs0266
Copy link
Owner

rhs0266 commented Sep 5, 2021

전체 코드를 봐야 더 자세히 알 수 있을 것 같네요. + 2202번이 아니라 2003번 문제 같은데 맞나요?

@java-saeng
Copy link
Author

java-saeng commented Sep 6, 2021

죄송합니다 2003번입니다

public class BOJ2003 {
    static int atoi(String str) {
        return Integer.parseInt(str);
    }
    static int N, M;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = atoi(st.nextToken());
        M = atoi(st.nextToken());

        int arr[] = new int[N];

        st = new StringTokenizer(br.readLine());

        for (int i = 0; i < N; i++) {
            arr[i] = atoi(st.nextToken());
        }

        int s = 0, e = 0, sum = 0, cnt = 0;
   ///////////////////////////////////////////////맞은부분
        while (true) {


            System.out.println(s + " " + e);
            if(sum >= M){
                sum -= arr[s];
                s++;
            }
            else if(e == N){
                break;
            }

            else{
                sum += arr[e++];
            }

            if(sum == M){
                cnt++;
            }
            //왜 e == N일떄 멈춰도되나?
            //e가 잇는상태에서 s가 계속 가면서 답이 될 수 있지않을까?
            //절대 아니다. 왜냐하면 이미 Sum보다 작으면서 e == N이면
            //s가 늘어난다하면 당연히 뺄텐데 여기서 이미 sum보다 작은데 뺴면 더 작아지니까 답이 안됨 어차피

        }
        ////////////////////////////////////////틀린 것
        /*
        int s = 0, e = 0, sum = 0, cnt = 0;
        while (true) {

//            System.out.println(s + " " + e);
  
            if(e == N) break;

            if(sum >= M){
                sum -= arr[s];
                s++;
            }
            else {
                sum += arr[e++];
            }

            if(sum == M){
                cnt++;
            }
        }
         */
        System.out.println(cnt);
    }
}
```
`

입니다. 
둘의 차이는 틀린 부분을 봤을 때, e == N일 때 break해줍니다.
그렇다면 당연히 뒷 부분들은 e != N일 때, 즉 N보다 작을 때 입니다.

맞은 부분은 if문에서 걸러주는데 이게 무슨 차이가 있는 것 같은데 명확히 얘기를 못하겠습니다. 
그래서 아직 덜 이해가 됐다라고 생각이 들었습니다.

+ 
이렇게 범위 나누는 것이 문제마다 당연하게 다를 텐데 혹시 선생님은 어떤 식으로 생각하시고
푸시는지 궁금합니다

@rhs0266
Copy link
Owner

rhs0266 commented Sep 7, 2021

...? 위에도 맞는데 System.out.println(s + " " + e); 을 지우고 내셔야죠.

@java-saeng
Copy link
Author

java-saeng commented Sep 7, 2021

  1. 맞은 것

image

  1. 틀린 것

image

입니다,,,

위에서 했던 질문이 아직까지 이해가 되질 않습니다.

@rhs0266
Copy link
Owner

rhs0266 commented Sep 7, 2021

아하 그렇군요! 다시 볼게요!

@java-saeng java-saeng changed the title BOJ 2203 BOJ 2003 Sep 7, 2021
@rhs0266
Copy link
Owner

rhs0266 commented Sep 8, 2021

4 4
1 1 1 2

틀린 코드에 대한 반례입니다.

@java-saeng
Copy link
Author

아하,, 반례 감사합니다!!
반례 기반으로 다시 이해해보겠습니다

@rhs0266 rhs0266 closed this as completed Sep 10, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants