μžλ°” μ•Œκ³ λ¦¬μ¦˜ 문제 풀이 μž…λ¬Έ. μ„Ήμ…˜3. Two Pointers, Sliding Window [νš¨μœ¨μ„± : O(n^2) --> O(n)] : μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•©

2023. 10. 19. 19:54γ†μΈν”„λŸ°/μžλ°” μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν’€μ΄ μž…λ¬Έ : μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„

728x90

 

https://hyejin.tistory.com/1223

-> 이전 문제 풀이 

 

 

5. μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•© 

μ„€λͺ…

Nμž…λ ₯으둜 μ–‘μ˜ μ •μˆ˜ N이 μž…λ ₯되면 2개 μ΄μƒμ˜ μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•©μœΌλ‘œ μ •μˆ˜ N을 ν‘œν˜„ν•˜λŠ” λ°©λ²•μ˜ κ°€μ§“μˆ˜λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

λ§Œμ•½ N=15이면

7+8=15

4+5+6=15

1+2+3+4+5=15

와 같이 총 3κ°€μ§€μ˜ κ²½μš°κ°€ μ‘΄μž¬ν•œλ‹€.

 

μž…λ ₯

첫 번째 쀄에 μ–‘μ˜ μ •μˆ˜ N(7<=N<1000)이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 

좜λ ₯

첫 쀄에 총 경우수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

 

μ˜ˆμ‹œ μž…λ ₯ 1 

15

 

μ˜ˆμ‹œ 좜λ ₯ 1

3

 

 

문제 풀이 1

public int solution(int n) {
    int answer = 0, sum;
    for (int i = 1; i <= n; i++) {
        sum = i;
        for (int j = i + 1; j <= n - i; j++) {
            sum += j;
            if (sum == n) {
                answer++;
                break;
            } else if (sum > n) {
                break;
            }
        }
    }
    return answer;
}

πŸ‘©πŸ»‍πŸ’» : λ‚˜λŠ” μš°μ„  μ €λ²ˆ 문제 풀이와 λ™μΌν•˜κ²Œ ν’€μ—ˆλ‹€. 이쀑 for 문을 μ΄μš©ν•΄μ„œ 첫번째 forλ¬Έμ—μ„œλŠ” 더할 첫번째 수λ₯Ό κ΅¬ν•˜κ³ , λ‘λ²ˆμ§Έ forλ¬Έμ—μ„œλŠ” κ·Έ 첫번째수 λ‹€μŒλΆ€ν„° 값을 λ”ν•˜λŠ”λ° μ΄λ•Œ sum이 nκ³Ό 값이 κ°™λ‹€λ©΄ answer 에 +1 ν•΄μ£Όκ³  break ν•˜κ³  λ‹€μŒ 첫번째 수둜 λ„˜μ–΄κ°€κ³ ,,, 

sum이 n보닀 크면 λ°”λ‘œ break문으둜 λ‚˜μ˜€λ„λ‘ ν–ˆλ‹€. 

 

 

 

문제 풀이 2

public int solution2(int n) {
    int answer = 0, sum =0;
    int lt = 0;
    int m = n / 2 + 1;
    int[] arr = new int[m];
    for (int i = 0; i < m; i++) {
        arr[i] = i + 1;
    }

    for (int rt = 0; rt < m; rt++) {
        sum += arr[rt];
        if (sum == n) {
            answer++;
        }

        while (sum >= n) {
            sum -= arr[lt++];

            if (sum == n) {
                answer++;
            }
        }
    }


    return answer;
}

πŸ‘Ύ : κ°•μ‚¬λ‹˜μ€ μš°μ„  배열을 μƒˆλ‘œ ν•˜λ‚˜ λ§Œλ“€μ—ˆλŠ”λ° μ΄λ•Œ λ°°μ—΄μ˜ ν¬κΈ°λŠ” n / 2 + 1 둜 μ„€μ •ν–ˆλ‹€. κ·Έ μ΄μœ λŠ” μ–΄μ°¨ν”Ό n / 2 + 1 뒀에 μ—°μ†λœ 값듀을 λ”ν•΄λ΄€μž n 값을 λ„˜μ–΄κ°€κΈ° λ•Œλ¬Έμ— ꡬ할 ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έ λ‹€μŒ λ°˜λ³΅λ¬Έμ„ 톡해 1 ~ n 값을 배열에 λ‹΄μ•„μ€€λ‹€. 

 

κ·Έ λ‹€μŒμ€ 이전 문제 풀이와 λ™μΌν•˜κ²Œ μ§„ν–‰ν•˜λŠ”λ° λ¨Όμ € sum 에 arr[rt] 값을 λ”ν•œλ‹€μŒ, sumκ³Ό n 값을 λΉ„κ΅ν•˜κ³ , κ°™μœΌλ©΄ answer +1 n보닀 크면 while문을 λŒλ©΄μ„œ sumμ—μ„œ arr[lt] 값을 λΉΌμ€€ λ‹€μŒ lt + 1 ν•΄μ€€λ‹€. κ·Έ λ‹€μŒ 이 sum 을 λ‹€μ‹œ nκ³Ό λΉ„κ΅ν•˜κ³ ... μ΄λ ‡κ²Œ λ°˜λ³΅ν•˜λ‹€λ³΄λ©΄ sum 이 n인 μ—°μ†λœ 숫자의 합은 λͺ‡κ°œμΈμ§€λ₯Ό μ•Œ 수 μžˆλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90