-
[Algorithm] Two pointers ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ๊ณตํต์์ ๊ตฌํ๊ธฐ๐ปProgramming/Algorithm 2024. 3. 2. 20:52
๋ฌธ์
A, B ๋ ๊ฐ์ ์งํฉ์ด ์ฃผ์ด์ง๋ฉด ๋ ์งํฉ์ ๊ณตํต ์์๋ฅผ ์ถ์ถํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์. (๊ฐ ์งํฉ์์ ์์๋ ์ค๋ณต๋์ง ์๋๋ค.)
์ ๋ ฅ ์์
5 1 3 9 5 2 5 3 2 5 7 8
์ถ๋ ฅ ์์
2 3 5
์ผ๋จ ๋ด๊ฐ ์ง ์ฝ๋๋ ์ด์ค for๋ฌธ์ ์ด์ฉํ์ฌ n๊ณผ m์ด ๊ฐ ๋ฆฌ์คํธ์ ์์์ ์๋ผ๊ณ ํ์์ ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(n*m)์ด์๋ค. ๊ทธ๋ฌ๋๋ ๋ฆฌ์คํธ๋ณ๋ก ๋ฐ์ดํฐ๊ฐ ๊ฐ 30000๊ฐ์ผ ๊ฒฝ์ฐ ํ์์์ ์ค๋ฅ๊ฐ ๋ฌ๋ค. ์ ํ์ด 1000ms์ธ๋ฐ 1700ms์ธ๊ฐ.. (๋จธ์ฑ..)
ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ค๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ O(n+m)์ด ๋๊ฒ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ์์์ ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
์ด์ค for๋ฌธ
import java.util.ArrayList; import java.util.Scanner; public class Main { private String solution(int n, int[] list, int m, int[] list2) { ArrayList<Integer> answerList = new ArrayList<>(); String answer = ""; if(n > m) { for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(list2[i] == list[j]) { answerList.add(list2[i]); break; } } } } else { for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(list[i] == list2[j]) { answerList.add(list[i]); break; } } } } // ๊ณตํต ์์๋ฅผ ์ ๋ ฌ for(int k = 0; k < answerList.size()-1; k++) { int leastIndex = k; for(int l = k+1; l < answerList.size(); l++) { if(answerList.get(leastIndex) > answerList.get(l)) { leastIndex = l; } } answer += answerList.get(leastIndex) + " "; int tmp = answerList.get(k); answerList.set(k, answerList.get(leastIndex)); answerList.set(leastIndex, tmp); } answer += answerList.get(answerList.size()-1); return answer; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Main main = new Main(); int n = scanner.nextInt(); int[] list = new int[n]; for(int i = 0; i < n; i++) { list[i] = scanner.nextInt(); } int m = scanner.nextInt(); int[] list2 = new int[m]; for(int j = 0; j < m; j++) { list2[j] = scanner.nextInt(); } System.out.println(main.solution(n, list, m, list2)); } }
๋ถ๋๋ฝ์ง๋ง ์ ๋ ฌ์ด ๋์ด์์ง ์์ ๋ ๋ฆฌ์คํธ ์ค์ ํ ์งง์ ๋ฆฌ์คํธ๋ฅผ ์ฒซ๋ฒ์งธ for๋ฌธ, ๋ ํฐ ๋ฆฌ์คํธ๋ฅผ ๋๋ฒ ์งธ for๋ฌธ ์์ ๋ฃ์ด ์ผ์นํ ๊ฒฝ์ฐ ๋ต์ ์ถ๊ฐํ๊ณ breakํ๋๋ก ๋ฐ๋ณตํ ํ,
์ต์ข ์ ์ผ๋ก ๊ณตํต ์์๊ฐ ๋ค์ด์๋ ๋ฆฌ์คํธ๋ฅผ ์ ํ ์ ๋ ฌ์ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋๋ก ํ ์ฝ๋์ด๋ค,,,
์ด๊ฒ ๊ณ์ ํ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ ์ฝ๋์ด๋ค.
Two Pointers๋ฅผ ์ด์ฉํ ์ฝ๋
import java.util.Arrays; import java.util.Scanner; public class Main { private String solution(int n, int[] list, int m, int[] list2) { Arrays.sort(list); Arrays.sort(list2); String answer = ""; int p1 = 0, p2 = 0; while(p1 < n && p2 < m) { if(list[p1] == list2[p2]) { answer += list[p1++] + " "; p2++; } else if(list[p1] < list2[p2]) { p1++; } else { p2++; } } return answer; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Main main = new Main(); int n = scanner.nextInt(); int[] list = new int[n]; for(int i = 0; i < n; i++) { list[i] = scanner.nextInt(); } int m = scanner.nextInt(); int[] list2 = new int[m]; for(int j = 0; j < m; j++) { list2[j] = scanner.nextInt(); } System.out.println(main.solution(n, list, m, list2)); } }
์ฐ์ ์ด ์ฝ๋๋ Arrays.sort๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๋ ๋ฆฌ์คํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ํ, ๋ ๋ฐฐ์ด์ ๊ฐ๊ฐ ๊ฐ๋ฆฌํฌ p1, p2 ํฌ์ธํฐ๋ฅผ ์์ฑํ๋ค. ๋ง์ฝ ์ผ์นํ๋ค๋ฉด ๋ ๋ค +๋ฅผ ํด์ฃผ๊ณ , ์ผ์นํ์ง ์๋๋ฐ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋ฐฐ์ด ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์์ ์ธ๋ฑ์ค๋ฅผ +ํด์ฃผ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(n+m)์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋์ถฉ ์ด๋ฐ ํ๋ก์ฐ๋ก ๊ฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๋์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌ๋ฆฌ n+m๋ฒ๋ง ๋ฐ๋ณตํ๋ฉด ์ ๋ ฌ๋ ๊ณตํต๋ ์์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ฌ์๋ ์ ์๊ณ ๋ฆฌ์ฆ ์์ ๋ ๋ฐฐ์ ๋๋ฐ ์ด์ ์์ผ ๊ธฐ์ต์ด ๋๋ ๋,,,, ์ ์ ์ฐจ๋ฆฌ์!!! ์๊ต์๋ ๊ฐ์ฌํฉ๋๋ค
'๐ปProgramming > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ์ฝ์ ์ ๋ ฌ(Insertion Sort) (0) 2024.03.28 [Algorithm] ๋ฒ๋ธ ์ ๋ ฌ(Bubble Sort) (0) 2024.03.27 [Algorithm] ์ ํ์ ๋ ฌ(Selection Sort) (0) 2024.03.26 [Algorithm] ์ฐ์ ๋ถ๋ถ์์ด (0) 2024.03.05 [Algorithm] Sliding Window ์๊ณ ๋ฆฌ์ฆ (0) 2024.03.03