ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ด๋
๋ฐฐ์ด์์ ๋ ๊ฐ์ ํฌ์ธํฐ(์ธ๋ฑ์ค)๋ฅผ์ด์ฉํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ์ด๋ก ์ ๋๋ค.
๋ฑํ ํน๋ณํ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค๋ ์ฝ๋ฉ ํ ์คํธ์์ ์ฌ์ฉํ ์ ์๋ ์ ์ฉํ ํ์ ๊ฐ๊น์ต๋๋ค.
2018๋ฒ
์ด๋ ํ ์์ฐ์ N์, ๋ช ๊ฐ์ ์ฐ์๋ ์์ฐ์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๋น์ ์ ์ด๋ค ์์ฐ์ N(1 ≤ N ≤ 10,000,000)์ ๋ํด์, ์ด N์ ๋ช ๊ฐ์ ์ฐ์๋ ์์ฐ์์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๊ฐ์ง์๋ฅผ ์๊ณ ์ถ์ดํ๋ค. ์ด๋, ์ฌ์ฉํ๋ ์์ฐ์๋ N์ดํ์ฌ์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, 15๋ฅผ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ 15, 7+8, 4+5+6, 1+2+3+4+5์ 4๊ฐ์ง๊ฐ ์๋ค. ๋ฐ๋ฉด์ 10์ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ 10, 1+2+3+4์ 2๊ฐ์ง๊ฐ ์๋ค.
N์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ง์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- ์ ๋ ฅ: ์ฒซ ์ค์ ์ ์ N์ด ์ฃผ์ด์ง๋ค.
- ์ถ๋ ฅ: ์ ๋ ฅ๋ ์์ฐ์ N์ ๋ช ๊ฐ์ ์ฐ์๋ ์์ฐ์์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๊ฐ์ง์๋ฅผ ์ถ๋ ฅํ์์ค.
์ฐ์๋ ์์ฐ์์ ํฉ์ ๊ตฌํ๋ ๊ฒ์ด ๋ฌธ์ ์ด๋ฏ๋ก ์์ ์ธ๋ฑ์ค์ ์ข ๋ฃ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ฌ ์ฐ์๋ ์๋ฅผ ํํํ๊ฒ ์ต๋๋ค.
์์ ์ธ๋ฑ์ค์ ์ข ๋ฃ ์ธ๋ฑ์ค๋ฅผ ํฌ ํฌ์ธํฐ๋ก ์ง์ ํด๋ด ์๋ค.
์์ผ๋ก ํ์ด๋ณด๊ธฐ
N =15๋ผ๊ณ ํด๋ณด๊ณ ๋ค์ ๊ทธ๋ฆผ์ฒ๋ผ 1~15๊น์ง์ ์ซ์๋ฅผ ๋ชจ๋ ์ ์ด๋ด ์๋ค.
์ด๋ค ์์ฐ์๋ค์ ํฉ์ผ๋ก 15๋ฅผ ๋ง๋๋ ค๋ฉด 15๋ณด๋ค ์์ ์ซ์๋ค๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ ๊ฐ์ ํฌ์ธํฐ start_index์ end_index๋ฅผ ๋ชจ๋ ์ฒซ ๋ฒ์งธ ์์์์ ์์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ sum = 1, count = 1๋ก ์ด๊ธฐํํฉ๋๋ค.
์ด๋ sum์ start_index๋ถํฐ end_index๊น์ง์ ํฉ์ด๊ณ , count๋ ์ฐ์๋ ์์ฐ์์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๊ฐ์ง์์ ๋๋ค.
count๊ฐ 0์ด ์๋๋ผ 1์์๋ถํฐ ์์ํ๋ ์ด์ ๋ '15'๋ผ๋ ์์ฐ์ ํ๋๋ง ์์ด๋ ์ฐ์๋ ์์ฐ์์ ํฉ์ผ๋ก 15๋ฅผ ํํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฆ, ์๊ธฐ ์์ ๋ง ์์ ๋๋ ๋ต์ผ๋ก ํฌํจ๋๊ธฐ ๋๋ฌธ์ 1๋ถํฐ ์นด์ดํธํฉ๋๋ค.
start_index์ end_index๋ฅผ ์์ง์ฌ๊ฐ๋ฉฐ ํฉ์ 15๋ก ๋ง๋ค์ด๋ด ์๋ค.
์ด๋ start_index์ end_index ํฌ ํฌ์ธํฐ์ ์ด๋์ ๋ค์๊ณผ ๊ฐ์ ์์น์ ๋ฐ๋ฆ ๋๋ค.
- sum > N: sum = sum - start_index; start_index++;
- sum์ด N๋ณด๋ค ํฌ๋ค๋ฉด ์์ ์๋ถํฐ ์ ์ธํ๋ค. start_index๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊ธด๋ค.
- sum < N: end_index++; sum = sum + end_index:
- sum์ด N๋ณด๋ค ์๋ค๋ฉด ํฐ ์๋ฅผ ํ๋ ๋ํ๋ค. end_index๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊ธด๋ค.
- sum == N: end_index++; sum = sum + end_index++; count++;
- sum์ด N๊ณผ ๊ฐ๋ค๋ฉด ์ฐ์๋ ์์ ํฉ์ผ๋ก N์ ํํํ ์กฐํฉ์ ํ๋ ์ฐพ์ ๊ฒ์ด๋ค. count๋ฅผ ์ฌ๋ฆฌ๊ณ , ๋ค์ ์กฐํฉ์ ์ฐพ๊ธฐ ์ํด end_index๋ฅผ ํ ์นธ ์ฎ๊ธฐ์.
์ฒ์์ sum = 1, start_index = 1, end_index = 1๋ก ์์ํ๋ค.
sum < 15(N)์ด๋ฏ๋ก end_index๋ฅผ ํ๋์ฉ ๋๋ฆฐ๋ค.
end_index = 5๊ฐ ๋ ๋, 1 + 2 + 3 + 4 + 5 = 15๋ก sum = 15๊ฐ ๋๋ค. ์ด๋ count๊ฐ ์ฆ๊ฐ๋๋ค.
์ดํ ์์น์ ๋ฐ๋ผ ๊ณ์ ๋ฐ๋ณตํ๋ค.
๋ฐ๋ณต๋ฌธ์ ์ธ์ ๋์ด ๋ ๊น?
end_index = N์ด ๋๋ ์๊ฐ ์ฒ์์ ๊ตฌํ๋ ์กฐํฉ '15'์ ๋ฌํ๋ฏ๋ก ๋์ด ๋๋ค.
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int[] arr = new int[N];
for(int i = 1; i<=N; i++) {
arr[i-1] = i;
}
int sum = 1;
int start_index = 1;
int end_index = 1;
int count = 1;
while(end_index != N) {
if(sum > N) {
sum -= start_index;
start_index++;
}
if(sum < N) {
end_index++;
sum += end_index;
}
if(sum == N) {
end_index++;
sum += end_index;
count++;
}
}
System.out.println(count);
}
}
1940๋ฒ
์ฃผ๋ชฝ์ ์ฒ ๊ธฐ๊ตฐ์ ์์ฑํ๊ธฐ ์ํ ํ๋ก์ ํธ์ ๋์ฐ๋ค. ๊ทธ๋์ ์ผ์ฒ ๋์ฅ์ ํตํด ์ฒ ๊ธฐ๊ตฐ์ด ์ ์ ๊ฐ์ท์ ๋ง๋ค๊ฒ ํ์๋ค. ์ผ์ฒ ๋์ฅ์ ์ฃผ๋ชฝ์ ๋ช ์ ๋ฐ๋ฅด๊ธฐ ์ํ์ฌ ์ฐ๊ตฌ์ ์ฐฉ์ํ๋ ์ค ์๋์ ๊ฐ์ ์ฌ์ค์ ๋ฐ๊ฒฌํ๊ฒ ๋์๋ค.
๊ฐ์ท์ ๋ง๋๋ ์ฌ๋ฃ๋ค์ ๊ฐ๊ฐ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ฐ์ท์ ๋ ๊ฐ์ ์ฌ๋ฃ๋ก ๋ง๋๋๋ฐ ๋ ์ฌ๋ฃ์ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ํฉ์ณ์ M(1 ≤ M ≤ 10,000,000)์ด ๋๋ฉด ๊ฐ์ท์ด ๋ง๋ค์ด ์ง๊ฒ ๋๋ค. ์ผ์ฒ ๋์ฅ์ ์์ ์ด ๋ง๋ค๊ณ ์๋ ์ฌ๋ฃ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์ท์ ๋ช ๊ฐ๋ ๋ง๋ค ์ ์๋์ง ๊ถ๊ธํด์ก๋ค. ์ด๋ฌํ ๊ถ๊ธ์ฆ์ ํ์ด ์ฃผ๊ธฐ ์ํ์ฌ N(1 ≤ N ≤ 15,000) ๊ฐ์ ์ฌ๋ฃ์ M์ด ์ฃผ์ด์ก์ ๋ ๋ช ๊ฐ์ ๊ฐ์ท์ ๋ง๋ค ์ ์๋์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- ์ ๋ ฅ: ์ฒซ์งธ ์ค์๋ ์ฌ๋ฃ์ ๊ฐ์ N(1 ≤ N ≤ 15,000)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ค์๋ ๊ฐ์ท์ ๋ง๋๋๋ฐ ํ์ํ ์ M(1 ≤ M ≤ 10,000,000) ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ์งธ ์ค์๋ N๊ฐ์ ์ฌ๋ฃ๋ค์ด ๊ฐ์ง ๊ณ ์ ํ ๋ฒํธ๋ค์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ณ ์ ํ ๋ฒํธ๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
- ์ถ๋ ฅ: ์ฒซ์งธ ์ค์ ๊ฐ์ท์ ๋ง๋ค ์ ์๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์์ ์ธ ๋ฒ์งธ ์ค์ ์ซ์ 6๊ฐ ์ค 2๊ฐ์ ํฉ์ผ๋ก 9๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ ์กฐํฉ์
(2, 7), (4, 5)๋ก 2๊ฐ์ ๋๋ค.
๋ ๊ฐ์ ์ซ์๋ฅผ ๋ฝ๊ณ ๊ทธ ํฉ์ด M๊ณผ ๊ฐ์์ง ๋น๊ตํด์ผ๊ฒ ์ง์. ์ด์ฒ๋ผ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ ๋๋ ์ ๋ ฌ์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ฒ ํ ์ ์๋ค๊ณ ํฉ๋๋ค.
์ฐ์ , ์ด๋ค ์ ๋ ฌ์ ํด๋ ๋ ์ง ํ์ธํด๋ด ์๋ค.
์๊ฐ ๋ณต์ก๋ O(nlogn) ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ค๊ณ ํ ๋ N์ ์ต๋ ๋ฒ์๊ฐ 15,000์ด๋ฏ๋ก 15,000log15,000 โ210,000 ์ ๋ ํฉ๋๋ค.
์ฆ 1์ด์ 210,000๋ฒ์ ์ฐ์ฐ์ ํด์ผ ํ๋ค๋๋ฐ ๋ณดํต์ ํ๋ซํผ์์๋ 1์ด์ ์ฝ 1์ต ๋ฒ์ ์ฐ์ฐ๊น์ง ๊ฐ๋น ๊ฐ๋ฅํ๋ฏ๋ก ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค์.
์ ๋ ฌ ํ, ์์ชฝ ๋์ ์์น๋ฅผ ํฌ ํฌ์ธํฐ๋ก ์ง์ ํด ๋ฌธ์ ์ ์ ๊ทผํด๋ด ์๋ค.
{2, 7, 4, 1, 5, 3}์ ์ ๋ ฌํ๋ฉด {1, 2, 3, 4, 5, 7} ์ ๋๋ค.
์ฌ๊ธฐ์ ํฌ ํฌ์ธํฐ๋ ์ด๋ป๊ฒ ์ด๋ํด์ผ ํ ๊น์?
์ฒ์์ ์ผ์ชฝ ๋์์ ์์ํ๋ ์ธ๋ฑ์ค๋ฅผ i, ์ค๋ฅธ์ชฝ ๋์์ ์์ํ๋ ์ธ๋ฑ์ค๋ฅผ j๋ผ๊ณ ํฉ์๋ค.
- A[i] + A[j] > M: j--; // ๋ฒํธ์ ํฉ์ด M๋ณด๋ค ํฌ๋ฏ๋ก ํฐ ๋ฒํธ ์ธ๋ฑ์ค๋ฅผ ๋ด๋ฆฝ๋๋ค.
- A[i] + A[j] < M: i++; // ๋ฒํธ์ ํฉ์ด M๋ณด๋ค ์์ผ๋ฏ๋ก ์์ ๋ฒํธ ์ธ๋ฑ์ค๋ฅผ ์ฌ๋ฆฝ๋๋ค.
- A[i] + A[j] == M: i++; j--; count++; // ์์ชฝ ํฌ์ธํฐ๋ฅผ ๋ชจ๋ ์ด๋์ํค๊ณ count๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ๋ฉ๋๋ค.
์ธ์ ๊น์ง ๋ฐ๋ณตํ๋ฉด ๋ ๊น์? i==j๊ฐ ๋๋ฉด ๋ชจ๋ ์กฐํฉ์ ์ดํด๋ดค๋ค๋ ๋ป์ด๋ ๊ทธ๋ ๋๋ด๋ฉด ๋ฉ๋๋ค.
๋จ i++, j--๋ฅผ ๊ฐ์ด ํ๋ค๋ณด๋ ์์ ํ๊ฒ i!=j ์กฐ๊ฑด ๋์ i<j ์กฐ๊ฑด์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ํฉ์๋ค.
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int M = s.nextInt();
int[] arr = new int[N];
for(int i=0;i<N;i++) {
arr[i] = s.nextInt();
}
Arrays.sort(arr);
int i = 0;
int j = N-1;
int count = 0;
while(i < j) {
int sum = arr[i] + arr[j];
if(sum > M) {
j--;
}
if(sum < M) {
i++;
}
if(sum == M) {
i++;
j--;
count++;
}
}
System.out.println(count);
}
}
Do it! ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ฉํ ์คํธ with JAVA ๊ฐ์ ๋ด์ฉ์ ๋๋ค.