๊ฐ์
ํฌ ํฌ์ธํฐ๋ ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ ๋ ๊ฐ์ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํฌํจํ๋ค. ์ด ๊ธ์์๋ ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด์ ์ด์ ์ ๋ง์ถ๊ณ ์๋ค. ์ฌ๊ธฐ์๋ i
์ j
๋๋ left
์ right
์ ๊ฐ์ ๋ ์ ์๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋๋ฐ, ์ด๋ค์ ๋ฐฐ์ด ๋๋ ๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ธ๋ค.
ํฌ ํฌ์ธํฐ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค. ์์ํ๊ธฐ ์ํด, ๋ค์ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์:
ํฌ์ธํฐ๋ฅผ ์ ๋ ฅ์ ๊ฐ์ฅ์๋ฆฌ ์์ชฝ์์ ์์ํ๋ค. ๊ทธ๋ค์ด ์๋ก ๋ง๋ ๋๊น์ง ์๋ก๋ฅผ ํฅํด ์ด๋ํ๋ค.
์ด ๊ฐ๋ ์ ๊ตฌ์ฒด์ ์ธ ๋จ๊ณ๋ก ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ๋ค:
- ํ๋์ ํฌ์ธํฐ๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค
0
์์, ๋ค๋ฅธ ํฌ์ธํฐ๋ ๋ง์ง๋ง ์ธ๋ฑ์คinput.length - 1
์์ ์์ํ๋ค. - ํฌ์ธํฐ๊ฐ ์๋ก ๊ฐ์์ง ๋๊น์ง while ๋ฌธ์ ์ฌ์ฉํ๋ค.
- ๋ฃจํ์ ๊ฐ ๋ฐ๋ณต์์, ํฌ์ธํฐ๋ฅผ ์๋ก ํฅํด ์ด๋์ํจ๋ค. ์ด๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์์ ์์ํ ํฌ์ธํฐ๋ฅผ ์ฆ๊ฐ์ํค๊ฑฐ๋, ๋ง์ง๋ง ์ธ๋ฑ์ค์์ ์์ํ ํฌ์ธํฐ๋ฅผ ๊ฐ์์ํค๊ฑฐ๋, ๋๋ ๋ ๋ค ์ํํจ์ ์๋ฏธํ๋ค. ์ด๋ค ํฌ์ธํฐ๋ฅผ ์ด๋ํ ์ง๋ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋ฌธ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
๋ค์์ ์ด ๊ฐ๋ ์ ์ค๋ช ํ๋ ์์ฌ ์ฝ๋์ด๋ค:
1
2
3
4
5
6
7
8
9
10
function fn(arr):
left = 0
right = arr.length - 1
while left < right:
๋ฌธ์ ์ ๋ฐ๋ผ ์ฌ๊ธฐ์ ์ผ๋ถ ๋ก์ง์ ์ํํ๋ค.
๋ค์ ์ค ํ๋๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ๋ ๋ง์ ๋ก์ง์ ์ํํ๋ค:
1. left++
2. right--
3. Both left++ and right--
์ด ๊ธฐ๋ฒ์ ์ฅ์ ์ ํฌ์ธํฐ๊ฐ ์๋ก๋ก๋ถํฐ $n$ ๊ฑฐ๋ฆฌ์์ ์์ํ์ฌ ๋งค ๋ฐ๋ณต๋ง๋ค ์ต์ํ ํ ๋จ๊ณ์ฉ ๊ฐ๊น์์ง๊ธฐ ๋๋ฌธ์ while ๋ฃจํ์ ๋ํ ๋ฐ๋ณต์ด $O(n)$์ ์ด๊ณผํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ๊ฐ ๋ฐ๋ณต ๋ด์ ์์ ์ $O(1)$์ ์ ์งํ ์ ์๋ค๋ฉด, ์ต์ ์ ์ฑ๋ฅ์ ๋ด๋ ์ ํ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฌ์ฑํ ์ ์๋ค. ์ด์ ์ด์ ๋ํ ๋ช ๊ฐ์ง ์์ ๋ฅผ ํตํด ์์ธํ ์์๋ณด๋๋ก ํ์
์์ 1: Palindrome
๋ฌธ์์ด
s
๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ๋ฌธ์์ด์ด ํ๋ฌธ์ด๋ฉดtrue
๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดfalse
๋ฅผ ๋ฐํํด๋ณด์.๋ฌธ์์ด์ด ํ๋ฌธ์ผ ๊ฒฝ์ฐ, ๊ทธ ๋ฌธ์์ด์ ์์์๋ถํฐ ์ฝ์ผ๋ ๋ค์์๋ถํฐ ์ฝ์ผ๋ ๋์ผํ๋ค. ์ด๋ ๋ฌธ์์ด์ ๋ค์ง์ด๋ ์ ๋ฌธ์์ด์ด ์ ์ง๋๋ ๊ฒ์ ์๋ฏธํ๋ค. ์์๋ก โabcdcbaโ๋ โracecarโ๊ฐ ์๋ค.
๋ฌธ์์ด์ ๋ค์ง์ผ๋ฉด, ์ฒซ ๋ฒ์งธ ๋ฌธ์๊ฐ ๋ง์ง๋ง ๋ฌธ์ ์์น์ ์ค๊ฒ ๋๋ค. ๋ง์ฝ ๋ฌธ์์ด์ด ๋ค์ง์ด์ง ์ํ์์๋ ๋์ผํ๋ค๋ฉด, ์ฒซ ๋ฌธ์์ ๋ง์ง๋ง ๋ฌธ์๊ฐ ๋์ผํ๊ณ , ๋ ๋ฒ์งธ ๋ฌธ์์ ๋ค์์ ๋ ๋ฒ์งธ ๋ฌธ์๊ฐ ๋์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด ํจํด์ด ๊ณ์ ์งํ๋๋ค. ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋ ์ ์๋ค. ์ฒ์์๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ฒซ ๋ฌธ์์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ๊ฒ์ฌํ๋ค. ๋ค์ ์์ ๋ฌธ์๋ฅผ ๊ฒ์ฌํ๋ ค๋ฉด ํฌ์ธํฐ๋ฅผ ์๋ก ํ ์นธ์ฉ ์ด๋ํ๋ฉด ๋๋ค. ํฌ์ธํฐ๊ฐ ์๋ก ๋ง๋๊ฑฐ๋ ๋ถ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๋ฐ๊ฒฌํ ๋๊น์ง ์ด ๊ณผ์ ์ ์ด์ด๊ฐ๋ค.
์์ 1 ์์ธ ๋ด์ฉ
์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ์ธ๋ฑ์ค, ์ฆ ์ผ์ชฝ ์ธ๋ฑ์ค์ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ถ์ ํ๋ค. ์ฒ์์ ์ผ์ชฝ ์ธ๋ฑ์ค๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๋ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ด ๋ฌธ์๋ค์ด ์๋ก ๊ฐ์ง ์๋ค๋ฉด, ํด๋น ๋ฌธ์์ด์ด ํ๋ฌธ์ผ ์ ์๋ค๋ ๊ฒ์ ์๊ณ , false
๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌธ์์ด์ด ํ๋ฌธ์ผ ์ ์์ผ๋ฏ๋ก, ๋ค์ ์์ ํ์ธํด์ผ ํ๋ค. ๋ค์ ์์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ํด, ์ผ์ชฝ ์ธ๋ฑ์ค๋ฅผ ํ๋ ์์ผ๋ก ์ด๋์ํค๊ณ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๋ฅผ ํ๋ ๋ค๋ก ์ด๋์ํจ๋ค. ๋ค์, ๋ฌธ์ ์์ด ๊ฐ์์ง ํ์ธํ๊ณ , ๊ฐ์ง ์๋ค๋ฉด false
๋ฅผ ๋ฐํํ๋ค.
์ฐ๋ฆฌ๋ ๋ถ์ผ์น๋ฅผ ๋ฐ๊ฒฌํ ๋๊น์ง(์ด ๊ฒฝ์ฐ ๋ฌธ์์ด์ ํ๋ฌธ์ด ๋ ์ ์์ผ๋ฏ๋ก false
๋ฅผ ๋ฐํ) ๋๋ ํฌ์ธํฐ๊ฐ ์๋ก ๋ง๋ ๋๊น์ง(์ด๋ ๋ชจ๋ ์์ ํ์ธํ๋ฉด์ ๋ฌธ์์ด ์ ์ฒด๋ฅผ ๊ฒํ ํ์์ ๋ํ๋) ์ด ๊ณผ์ ์ ๊ณ์ํ๋ค. ๋ชจ๋ ์์ ๋ถ์ผ์น ์์ด ๊ฑฐ์น๋ฉด ๋ฌธ์์ด์ด ํ๋ฌธ์์ ์ ์ ์์ผ๋ฏ๋ก true
๋ฅผ ๋ฐํํ ์ ์๋ค.
ํฌ์ธํฐ๊ฐ ์๋ก ๋ง๋ ๋๊น์ง ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ ค๋ฉด while ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. while ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ํ๋์ ์์ ํ์ธํ๋ค. ํ์ธ์ด ์ฑ๊ณตํ๋ฉด left
๋ฅผ ์ฆ๊ฐ์ํค๊ณ right
๋ฅผ ๊ฐ์์์ผ ๋ค์ ์์ผ๋ก ์ด๋ํ๋ค. ํ์ธ์ ์คํจํ๋ฉด false
๋ฅผ ๋ฐํํ๋ค.
n
์ ์ ์ฒด ๋ฌธ์ ์์ด๋ฏ๋ก,n - i - 1
์ ๋ง์ง๋ง, ๋ง์ง๋ง์์ ๋ ๋ฒ์งธ, ๋ง์ง๋ง์์ ์ธ ๋ฒ์งธ ๋ฑ์ ๋ฌธ์์ ํด๋นํ๋ค. ์ ๋ ฅ๊ฐ์ด 0์ผ๋ก ์ธ๋ฑ์ฑ๋๊ธฐ ๋๋ฌธ์-1
์ด ํ์ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool checkIfPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn check_if_palindrome(s: &str) -> bool {
let bytes = s.as_bytes();
let mut left = 0;
let mut right = s.len() - 1;
while left < right {
if bytes[left] != bytes[right] {
return false;
}
left += 1;
right -= 1;
}
true
}
๋ฌธ์ ๋ฐฐ์ด์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋๋ผ๋, ํ์ฌ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค. ์ด๋ ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ด ์ถ์์ ์ผ๋ก ๋ฐ๋ณต ๊ฐ๋ฅํ ์ด๋ค ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ์ธ๋ฑ์ค ๋ณ์๊ฐ ์ด๋ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.
์ด ๋ฐฉ๋ฒ์ ๊ต์ฅํ ํจ์จ์ ์ด๋ค. ์๋ํ๋ฉด ์คํ ์๊ฐ์ $O(n)$์ด๊ณ , ์ฌ์ฉํ๋ ๊ณต๊ฐ์ $O(1)$์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ค์ง ๋ ์ ์ ๋ณ์๋ง์ ์ฌ์ฉํ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋งค์ฐ ์ ์ฝ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ $O(n)$์ธ๋ฐ, ๊ทธ ์ด์ ๋ while ๋ฌธ์ ์ฌ์ฉํ ๋ฐ๋ณต ๊ฐ๊ฐ์ด $O(1)$์ ์๊ฐ์ ์๋ชจํ๊ณ , ์ด while ๋ฌธ ๋ฐ๋ณต์ $O(n)$์ ์ด๊ณผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ํฌ์ธํฐ๋ค์ ์ฒ์์ ์๋ก $O(n)$์ ๊ฑฐ๋ฆฌ์ ๋จ์ด์ ธ ์์ผ๋ฉฐ, ๋ฐ๋ณตํ ๋๋ง๋ค ํ ๋จ๊ณ์ฉ ์๋ก์๊ฒ ๊ฐ๊น์์ง๋ค.
์์ 2: ๋ ์์ ํฉ์ด ๋ชฉํ๊ฐ์ธ ์์ ์กด์ฌ ์ฌ๋ถ
์ค๋ณต๋์ง ์๋ ์ ์๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด๊ณผ ๋ชฉํ ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ๋ ์์ ํฉ์ด ๋ชฉํ๊ฐ๊ณผ ๊ฐ์ ์์ ์์ด ์กด์ฌํ๋ฉด
true
๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดfalse
๋ฅผ ๋ฐํํด๋ณด์. ์ด ๋ฌธ์ ๋ Two Sum๊ณผ ์ ์ฌํ๋ค. (Two Sum์์๋ ์ ๋ ฅ์ด ์ ๋ ฌ๋์ง ์๋๋ค).์๋ฅผ ๋ค์ด,
nums = [1, 2, 4, 6, 8, 9, 14, 15]
๋ฐtarget = 13
์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ,4 + 9 = 13
์ด๋ฏ๋กtrue
๋ฅผ ๋ฐํํ๋ค.
๊ฐ์ฅ ์ง๊ด์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ซ์ ์์ ๋ฐ๋ณตํ์ฌ ํ์ธํ๋ ๊ฒ์ด๋ค. ์ด ๋ฐฉ์์ ๊ฐ ์ซ์๊ฐ ๋ค๋ฅธ ์ซ์์ ์ง์ ์ด๋ฃจ๊ฒ ๋๋ฏ๋ก $O(n^2)$์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ์ฌ๊ธฐ์ $n$์ ๋ฐฐ์ด์ ๊ธธ์ด์ด๋ค. ๋ฐฐ์ด์ด ์ ๋ ฌ๋ ์ํ์ด๋ฏ๋ก, ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๊ฐ ๋ณต์ก๋๋ฅผ $O(n)$์ผ๋ก ์ค์ผ ์ ์๋ค.
์์ ์ ์
๋ ฅ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ดํด๋ณด์. ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ, ์ฒซ ๋ฒ์งธ ์ซ์์ ๋ง์ง๋ง ์ซ์๋ถํฐ ํ์ธ์ ์์ํ๋ค. ์ด๋ค์ ํฉ๊ณ๋ 1 + 15 = 16
์ด๋ค. 16
์ ๋ชฉํ๊ฐ๋ณด๋ค ํฌ๋ฏ๋ก, ํฉ๊ณ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ค. ๋ค์์ผ๋ก, 1 + 14 = 15
์ ํฉ๊ณ๋ฅผ ์ป๊ฒ ๋๋๋ฐ, ์ด ๊ฒฝ์ฐ์๋ ํฉ๊ณ๊ฐ ๋ ํฌ๋ฏ๋ก ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ค. ์ดํ 1 + 9 = 10
์ด ๋๋ฉฐ, ์ด ํฉ๊ณ๊ฐ ๋ ์์ผ๋ฏ๋ก ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋ํ์ฌ ํฉ๊ณ๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํ๋ค. 2 + 9 = 11
์ ๋ชฉํ๊ฐ๋ณด๋ค ์์ผ๋ฏ๋ก ํฌ์ธํฐ๋ฅผ ๋ค์ ์ด๋์ํจ๋ค. ๊ฒฐ๊ตญ, 4 + 9 = 13
์ผ๋ก ๋ชฉํ๊ฐ์ ๋๋ฌํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ด ์๋ํ๋ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค: ์ซ์๊ฐ ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ฉด ํด๋น ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด ๊ณ์ํด์ ์ฆ๊ฐํ๋ค(nums[left] = x
). ๋ฐ๋๋ก, ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ฉด ๊ฐ๋ฆฌํค๋ ๊ฐ์ด ๊ณ์ํด์ ๊ฐ์ํ๋ค(nums[right] = y
). x + y > target
์ธ ์ํฉ์์๋ x
๊ฐ ๊ณ์ ์ฆ๊ฐํ ์๋ฐ์ ์์ผ๋ฏ๋ก, y์์ ์กฐํฉ์ผ๋ก๋ ํด๊ฒฐ์ฑ
์ ์ฐพ์ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ
์ด ์๋ค๋ฉด y
๋ฅผ ๊ฐ์์ํค๋ฉฐ ๊ทธ๊ฒ์ ์ฐพ์์ผ ํ๋ค. x + y < target
์ธ ๊ฒฝ์ฐ์๋ ๋น์ทํ ๋
ผ๋ฆฌ๊ฐ x
์ ์ ์ฉ๋์ด, x
๋ฅผ ์ฆ๊ฐ์ํค๋ฉฐ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ผ ํ๋ค.
์์ 2 ์์ธ ๋ด์ฉ
nums = [3, 6, 21, 23, 25]
๋ฐฐ์ด๊ณผ target = 27
์ด ์๋ค๊ณ ํด๋ณด์. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ๋ ์๋ฅผ ๊ณจ๋ผ ๊ทธ ํฉ์ด target
์ด ๋๋ ๊ฒ์ด๋ค. ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ, ๋ฐฐ์ด์ ์ฒ์๊ณผ ๋์์ ์์ํ๋ค. ๋ฐฐ์ด์ด ์ ๋ ฌ๋์ด ์์ผ๋ฏ๋ก, ์ด๊ฒ์ ๊ฐ์ฅ ์์ ์์ ๊ฐ์ฅ ํฐ ์๋ฅผ ์๋ฏธํ๋ค. ํ์ฌ 3 + 25 = 28
๋ก, ์ด ํฉ์ target
๋ณด๋ค ํฌ๋ค.
25
๋ฅผ ์ดํด๋ณด๋ฉด, ๊ฐ์ฅ ์์ ์์์ ํฉ์ฐ๋ target
์ ์ด๊ณผํ๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ 25
๊ฐ ๋ต์ ์ผ๋ถ์ผ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์๋ํ๋ฉด 25
๋ณด๋ค ์์ ๋ค๋ฅธ ์์ ์ง์ ์ง์ด๋ ํฉ์ด ๋ ์ปค์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์, 25
๋ฅผ ์ ์ธํ๊ณ ๋ค์์ผ๋ก ํฐ ์์ธ 23
์ผ๋ก ๋์ด๊ฐ๋ค.
์ด์ , 3 + 23 = 26
์ผ๋ก, ์ด ํฉ์ target
๋ณด๋ค ์๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ 25
๋ฅผ ๋ต์์ ์ ์ธํ๋ค. ์ด ์ํฉ์์ 23
์ด ๊ฐ์ฅ ํฐ ์๊ฐ ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ 3
๊ณผ์ ํฉ์ด ๋ชฉํ์น์ ๋ฏธ์น์ง ๋ชปํ๋ค. ์ด๋ 3
์ด ๋ ํฐ ์์ ์ง์ ์ง์ด๋ target
์ ๋๋ฌํ์ง ๋ชปํ ๊ฒ์ด๋ผ๋ ์๋ฏธ์ด๋ฏ๋ก, 3
์ญ์ ๋ต์ ์กฐ๊ฑด์์ ์ ์ธํ๋ค.
๋ค์์ผ๋ก 6
์ด ์ ํ๋๋ค. ์ด์ ํฉ์ 6 + 23 = 29
๊ฐ ๋๋๋ฐ, ์ด๋ ๋ํ ๋๋ฌด ํฌ๋ค. ์ด์ ์ ๋
ผ๋ฆฌ์ ๋ฐ๋ผ, 23
์ญ์ ๋ต์ด ๋ ์ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฐ๋ค. ์๋ํ๋ฉด ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ์์์ ํฉ์ฐ๋ target
์ ์ด๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ด์ 21
๋ก ๋์ด๊ฐ ๋ณด๋ฉด, 6 + 21 = 27
์ด ๋์ด ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ ๋ต์ ์ป๊ฒ ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ธฐ ์ํด, ํฌ์ธํฐ๊ฐ ์๋ก ๋ง๋๊ฑฐ๋, ํฉ์ด target
๊ณผ ๊ฐ์์ง ๋๊น์ง ํฌ์ธํฐ๋ฅผ ์ด๋์ํค๋ฉฐ while ๋ฌธ์ ์คํํ๋ค. ๋ง์ฝ ์ธ์ ๋ ์ง ํฉ์ด target
๊ณผ ๊ฐ๋ค๋ฉด, ๊ทธ๋๋ true
๋ฅผ ๋ฐํํ๋ค. ํฌ์ธํฐ๋ค์ด ์๋ก ๋ง๋ฌ๋๋ฐ๋ target
์ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ, false
๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. ์ด ๋ฐฉ์์ ์
๋ ฅ๋ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๋๊น์ง ์ฒดํฌํ๋ ๊ณผ์ ์ ํตํด ์ด๋ฃจ์ด์ง๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool checkForTarget(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left < right) {
int curr = nums[left] + nums[right];
if (curr == target) {
return true;
}
if (curr > target) {
right--;
} else {
left++;
}
}
return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn check_for_target(nums: &[i32], target: i32) -> bool {
let mut left = 0;
let mut right = nums.len() - 1;
while left < right {
let curr = nums[left] + nums[right];
if curr == target {
return true;
}
if curr > target {
right -= 1;
} else {
left += 1;
}
}
false
}
์ด์ ์์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด ์๊ณ ๋ฆฌ์ฆ์ $O(1)$์ ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์๊ฐ ๋ณต์ก๋๋ $O(n)$์ด๋ค.
ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ
ํฌ์ธํฐ ๋ ๊ฐ๋ฅผ ๋ฐฐ์ด์ ์ฒ์๊ณผ ๋์์ ์์ํ์ฌ ์๋ก๋ฅผ ํฅํด ์ด๋์ํค๋ ๋ฐฉ์์ ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋ถ๊ณผํ๋ค. ์๊ณ ๋ฆฌ์ฆ์ด ์๋ฆ๋ค์ด ์ด์ ์ค ํ๋๋ ๊ทธ๊ฒ์ด ์ผ๋ง๋ ์ถ์์ ์ผ๋ก ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์๋์ง์ ์๋ค. โํฌ ํฌ์ธํฐโ๋ ๋จ์ง ํ ๋ฐฉ๋ฒ์ผ ๋ฟ, ์ฌ๋ฌ ๊ฐ์ง ํํ๋ก ๊ตฌํ๋ ์ ์๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ๊ณผ ์๋ก์ด ์์ ๋ค์ ํตํด ์ด ๊ฐ๋ ์ ๋ ํ์ํด๋ณด์. ๋ค์ ์ค๋ช ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ ฅ๊ฐ์ผ๋ก ๋ ๊ฐ์ ์ํ ๊ฐ๋ฅํ ์ํ์ค(์: ๋ ๋ฐฐ์ด)๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์๋ค.
๋ ์ ๋ ฅ ์ํ์ค๋ฅผ ๋์์ ์ํํ๋ฉฐ ๋ชจ๋ ์์๋ฅผ ํ์ธํ๋ค.
์ด ๊ฐ๋ ์ ๋จ๊ณ๋ณ๋ก ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ๋ค:
- ๊ฐ ์ํ ๊ฐ๋ฅํ ์ํ์ค๋ง๋ค ํฌ์ธํฐ ํ๋์ฉ, ์ด ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋ง๋ ๋ค. ์ด ํฌ์ธํฐ๋ค์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์์ ์์ํ๋ค.
- ํฌ์ธํฐ ์ค ํ๋๊ฐ ํด๋น ์ํ์ค์ ๋์ ๋๋ฌํ ๋๊น์ง while ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฐ๋ณตํ๋ค.
- ๋ฐ๋ณต์ ๊ฐ ๋จ๊ณ์์ ํฌ์ธํฐ๋ฅผ ์์ผ๋ก ์ด๋์ํจ๋ค. ์ด๋ ํฌ์ธํฐ ์ค ํ๋ ํน์ ๋ ๋ค๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ค ํฌ์ธํฐ๋ฅผ ์ด๋์ํฌ์ง๋ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- while ๋ฌธ์ ํ๋์ ํฌ์ธํฐ๊ฐ ๋์ ๋๋ฌํ๋ฉด ์ข ๋ฃ๋๋ฏ๋ก, ๋ฐ๋ณต์ด ๋๋ฌ์ ๋ ๋ค๋ฅธ ํฌ์ธํฐ๋ ์์ง ํด๋น ์ํ์ค์ ๋์ ๋๋ฌํ์ง ์์ ์ ์๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ชจ๋ ์์๋ฅผ ์ฒดํฌํด์ผ ํ๊ธฐ ๋๋ฌธ์, ์ด ๊ฒฝ์ฐ ๋ ์ํ์ค๊ฐ ์์ ํ ์์ง๋ ๋๊น์ง ์ถ๊ฐ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
์ด๋ฌํ ๊ฐ๋ ์ ์์ฌ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function fn(arr1, arr2):
i = j = 0
while i < arr1.length AND j < arr2.length:
๋ฌธ์ ์ ํน์ฑ์ ๋ง๋ ๋ก์ง์ ์ฌ๊ธฐ์ ๊ตฌํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋์ ์ค ํ๋๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํ ์ถ๊ฐ ๋ก์ง์ ์ํํ๋ค:
1. i++
2. j++
3. i++ ๋ฐ j++
// 4๋จ๊ณ: ๋ ์ํ์ค๊ฐ ๋ชจ๋ ์์ง๋์๋์ง ํ์ธํ๋ค.
// ์๋ ๋ฃจํ ์ค ํ๋๋ง ์คํ๋ ๊ฒ์ด๋ผ๋ ์ ์ ์ ์ํ๋ค.
while i < arr1.length:
๋ฌธ์ ์ ํน์ฑ์ ๋ง๋ ์ถ๊ฐ ๋ก์ง์ ์ฌ๊ธฐ์ ๊ตฌํํ๋ค.
i++
while j < arr2.length:
๋ฌธ์ ์ ํน์ฑ์ ๋ง๋ ์ถ๊ฐ ๋ก์ง์ ์ฌ๊ธฐ์ ๊ตฌํํ๋ค.
j++
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๊ฒ, ์ด ๋ฐฉ๋ฒ์ while ๋ฌธ ๋ด์ ์์
์ด $O(1)$์ด๋ฉด ์ ํ ์๊ฐ ๋ณต์ก๋ $O(n + m)$์ ๊ฐ์ง๊ฒ ๋๋ค. n
์ arr1
์ ๊ธธ์ด์ด๊ณ , m
์ arr2
์ ๊ธธ์ด์ด๋ค. ์ด๋ ๊ฐ ๋ฐ๋ณต์์ ์ ์ด๋ ํ๋์ ํฌ์ธํฐ๊ฐ ์์ผ๋ก ์ด๋ํ๋ฉฐ, n + m
๋ฒ์ ์ด๋ ์์ด๋ ๋ฐฐ์ด๋ค์ด ์์ ํ ์์ง๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋ช ๊ฐ์ง ์์ ๋ฅผ ํตํด ์ด ๋ฐฉ๋ฒ์ ๋ ๊น์ด ์ดํดํด ๋ณด์.
์์ 3: ๋ ๋ฐฐ์ด์ ์ ๋ ฌ๋ ๊ฒฐํฉ
์ ๋ ฌ๋ ๋ ์ ์ ๋ฐฐ์ด
arr1
๊ณผarr2
๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค์ ํฉ์ณ ์ ๋ ฌ๋ ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐํํด๋ณด์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ๋ ๋ฐฐ์ด์ ํฉ์น ํ, ์ ๋ ฌ์ ํ๋ ๊ฒ์ด๋ค. ๋ง์ฝ n
์ด arr1
๊ณผ arr2
์ ๊ธธ์ด์ ํฉ์ด๋ผ๋ฉด, ์ด ๋ฐฉ์์ ์๊ฐ ๋ณต์ก๋๋ ์ ๋ ฌํ๋ ๋ฐ ๋๋ ๋น์ฉ ๋๋ฌธ์ $O(n \cdot \log{}n)$์ด ๋๋ค. ํ์ง๋ง, ์
๋ ฅ ๋ฐฐ์ด์ด ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ค๋ฉด, ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์๊ฐ ๋ณต์ก๋๋ฅผ $O(n)$๊น์ง ์ค์ผ ์ ์๋ค.
์ด์ ์ค๋ช ์์๋
n
์arr1
์ ๊ธธ์ด๋ก,m
์arr2
์ ๊ธธ์ด๋ก ์ ์ํ์๋ค. ํ์ง๋ง ์ฌ๊ธฐ์๋n
์arr1
์ ๊ธธ์ด์arr2
์ ๊ธธ์ด์ ํฉ์ผ๋ก ๋ณด๊ณ ์๋ค. ์ด์ ๋ ๋ฌด์์ผ๊น? ๋น ์ค ํ๊ธฐ๋ฒ์์๋ ๋ณ์๋ฅผ ์ฐ๋ฆฌ๊ฐ ํ์์ ๋ฐ๋ผ ์ ์ํ ์ ์๋ค๋ ์ ์ ๊ธฐ์ตํ์.n
๊ณผm
์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋์ง๋ง, ๋ ๋ฐฐ์ด์ ํฉ์น๋ ๊ฒ์ ๊ณ ๋ คํ ๋ ์ ์ฒด ๊ธธ์ด๊ฐ ์ค์ํ ์ ๋ณด์ด๋ฏ๋กn
์ผ๋ก ํํํ๋ ๊ฒ์ด ์ ์ ํ๋ค. ์ด์ ๋ฐ๋ผ ์ ๋ ฌ ๋ฐฉ์์ ์๊ฐ ๋ณต์ก๋๋ $O((n + m) \cdot \log(n + m))$์ด๊ณ , ๋ค์์ ์ค๋ช ํ ๋ฐฉ์์ $O(n + m)$์ด ๋ ๊ฒ์ด๋ค.
์ ๋ต ๋ฐฐ์ด ans
๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ๋จ๊ณ์ ์ด๋ค. ๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์์์ ์์ํ์ฌ, ๊ฐ ๋จ๊ณ์์ ๋ ์์๋ฅผ ๋น๊ตํ๋ค. ๋ ์์ ๊ฐ์ ans
์ ์ถ๊ฐํ๊ณ , ๊ทธ์ ํด๋นํ๋ ๋ฐฐ์ด์ ํฌ์ธํฐ๋ฅผ ๋ค์ ์์น๋ก ์ฎ๊ธด๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด, ์ต์ข
์ ์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ป์ ์ ์๋ค.
์์ 3 ์์ธ ๋ด์ฉ
๋ฐฐ์ด์ ๊ธธ์ด๊ฐ $n$์ผ ๋, ์ ๋ ฌํ๋ ๋ฐ ํ์ํ ์๊ฐ์ $O(n \cdot \log{}n)$์ด๋ค. ๊ทธ๋ฌ๋ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ด์ฉํ๋ค๋ฉด, $\log{}n$ ์์๋ฅผ ์ค์ผ ์๊ฐ ์์ด ์๊ฐ ๋ณต์ก๋๋ฅผ ํฅ์์ํฌ ์ ์๋ค.
์ฒ์์๋ ๊ฐ ๋ฐฐ์ด์์ ๊ฐ์ฅ ์์ ์ซ์๋ฅผ ๋ณด๊ณ ์์ํ๋ค. ๋ ์ซ์ ์ค ๋ ์์ ์ซ์๋ ๋ฐ๋์ ๋ค๋ฅธ ์ซ์ ์์ ์์ผ ํ๋ค. ๊ทธ๋์ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ ์์ ์ซ์๋ฅผ ์ถ๊ฐํ๊ณ , ๊ทธ ๋ฐฐ์ด์์ ๋ค์ ์ซ์๋ก ๋์ด๊ฐ๋ค. ๋ง์ฝ ๋ ์ซ์๊ฐ ๊ฐ๋ค๋ฉด ์ด๋ ์ชฝ์ ์ ํํด๋ ์๊ด์๋ค. ๊ทธ์ ์ ํํ๊ธฐ ๋๋ฆ์ด๋ค.
์ด ๋จ๊ณ๋ฅผ ํ๋์ ๋ฐฐ์ด์ด ๋ ์ด์ ๋จ์ ์ซ์๊ฐ ์์ ๋๊น์ง ๊ณ์ํ๋ค. ๊ทธ ์ํฉ์ด ์ค๋ฉด, ๋ค๋ฅธ ํ๋์ ๋ฐฐ์ด์๋ ์ฌ์ ํ ์ซ์๋ค์ด ๋จ์ ์๋ค. ์ด ์์๋ค์ ์ด๋ฏธ ๋น๊ต๋ฅผ ๋ง์น ๋ฐฐ์ด์ ์์๋ค๋ณด๋ค ๋ชจ๋ ํฐ ๊ฐ์ด๋ค. ๊ทธ๋์ ์ด ๋จ์ ์์๋ค์ ๊ฒฐ๊ณผ ๋ฐฐ์ด ๋ค์ชฝ์ ๊ทธ๋๋ก ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
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
vector<int> combine(vector<int>& arr1, vector<int>& arr2) {
vector<int> ans;
int i = 0, j = 0;
while (i < arr1.size() && j < arr2.size()) {
if (arr1[i] < arr2[j]) {
ans.push_back(arr1[i]);
i++;
} else {
ans.push_back(arr2[j]);
j++;
}
}
while (i < arr1.size()) {
ans.push_back(arr1[i]);
i++;
}
while (j < arr2.size()) {
ans.push_back(arr2[j]);
j++;
}
return ans;
}
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
fn combine(arr1: Vec<i32>, arr2: Vec<i32>) -> Vec<i32> {
let mut ans = Vec::new();
let (mut i, mut j) = (0, 0);
while i < arr1.len() && j < arr2.len() {
if arr1[i] < arr2[j] {
ans.push(arr1[i]);
i += 1;
} else {
ans.push(arr2[j]);
j += 1;
}
}
while i < arr1.len() {
ans.push(arr1[i]);
i += 1;
}
while j < arr2.len() {
ans.push(arr2[j]);
j += 1;
}
ans
}
์ด์ ๋ ์์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๊ฐ $O(n)$์ด๋ฉฐ, ๊ณต๊ฐ ๋ณต์ก๋๋ $O(1)$์ด๋ค(์ถ๋ ฅ์ ์ถ๊ฐ ๊ณต๊ฐ์ผ๋ก ๊ณ์ฐํ์ง ์๋ ๊ฒฝ์ฐ).
์์ 4: ์๋ธ ์ํ์ค ์ฌ๋ถ ํ๋จ
๋ ๋ฌธ์์ด
s
์t
๊ฐ ์ฃผ์ด์ก์ ๋,s
๊ฐt
์ ์๋ธ์ํ์ค์ธ ๊ฒฝ์ฐtrue
๋ฅผ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐfalse
๋ฅผ ๋ฐํํ๋ผ.๋ฌธ์์ด์ ์๋ธ์ํ์ค๋ ์๋ณธ ๋ฌธ์์ด์์ ์ผ๋ถ(๋๋ ์ ํ) ๋ฌธ์๋ฅผ ์ญ์ ํ์ฌ ์ป์ ์ ์๋ ๋ฌธ์ ์ํ์ค๋ก, ๋จ์ ์๋ ๋ฌธ์์ ์๋์ ์์๋ ์ ์ง๋๋ค. ์๋ฅผ ๋ค์ด, โaceโ๋ โabcdeโ์ ์๋ธ์ํ์ค์ด์ง๋ง โaecโ๋ ๊ทธ๋ ์ง ์๋ค.
์ด ๋ฌธ์ ์์๋ s
์ ๋ฌธ์๋ค์ด t
๋ด์ ๋์ผํ ์์๋ก ์กด์ฌํ๋์ง ํ์ธํด์ผ ํ๋ฉฐ, ๋ฌธ์ ์ฌ์ด์ ๊ณต๋ฐฑ์ด ์์ด๋ ์๊ด์๋ค. ์๋ฅผ ๋ค์ด "ace"
๋ "abcde"
์ ์๋ธ์ํ์ค๋ก ๊ฐ์ฃผ๋๋ค. ์๋ํ๋ฉด "abcde"
๋ด์ "a"
, "c"
, "e"
๊ฐ ์์๋๋ก ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌธ์๋ค์ด ์ฐ์์ ์ด์ง ์์๋ ๊ด์ฐฎ๋ค๋ ์ ์ด ์ค์ํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด์, ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ ์ฉํ ์ ์๋ค. ๋ง์ฝ s[i]
๊ฐ t[j]
์ ๊ฐ๋ค๋ฉด, ์ด๋ s
์ i
๋ฒ์งธ ๋ฌธ์๋ฅผ t
์์ ๋ฐ๊ฒฌํ์์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ i
๋ฅผ ์ฆ๊ฐ์์ผ s
์ ๋ค์ ๋ฌธ์๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค. ๋ฐ๋ณต ๊ณผ์ ์์ j
๋ ์ํฉ์ ์๊ด์์ด ์ฆ๊ฐ์์ผ์ผ ํ๋ค๋ ์ ์ ๋ช
์ฌํด์ผ ํ๋ค(์ด ๋ถ๋ถ์ for ๋ฌธ์ ์ฌ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ์๋ ์๋ค). ๋ง์ฝ s
์ ๋ชจ๋ ๋ฌธ์๋ฅผ t
๋ด์์ ์ฐพ์ ์ ์๋ค๋ฉด, ์ฆ ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ง๋ง์ i
๊ฐ s
์ ๊ธธ์ด์ ๊ฐ๋ค๋ฉด, s
๋ t
์ ์๋ธ์ํ์ค๋ผ๊ณ ํ ์ ์๋ค.
์์ 4 ์์ธ ์ค๋ช
s
์ ๋ชจ๋ ๋ฌธ์์ ๋ํด t์์ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์ฐพ์์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, s = "bc"
์ด๊ณ t = "abcd"
๋ผ๊ณ ๊ฐ์ ํ์. ๋ ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ถํฐ ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋น๊ต๋ฅผ ์์ํ๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ s
์ ์ฒซ ๋ฌธ์ "b"
๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค. ํ์ง๋ง t
์ ์ฒซ ๋ฌธ์๋ "a"
์ด๋ฏ๋ก ์ผ์นํ์ง ์๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, t
์์ ๋ค์ ๋ฌธ์๋ก ๋์ด๊ฐ์ผ ํ๋ค. "b"
๋ฅผ ์์ง ์ฐพ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ s
๋ ๊ทธ๋๋ก ๋๋ค.
t
์ ๋ค์ ๋ฌธ์๋ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ "b"
์ด๋ฏ๋ก ์ผ์นํ๋ค. ์ด์ , s
์ ๋ค์ ๋ฌธ์์ธ "c"
๋ฅผ ์ฐพ๊ธฐ ์ํด ๋์ด๊ฐ ์ ์๋ค. t
์์ ์ผ์นํ๋ ๋ฌธ์๋ ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, t
์์๋ ๊ณ์ ์ ์งํด์ผ ํ๋ค. t
์ ๋ค์ ๋ฌธ์ ๋ํ "c"
๋ก, ์ฐ๋ฆฌ๋ ๋ ๋ค๋ฅธ ์ผ์น ํญ๋ชฉ์ ๋ฐ๊ฒฌํ๋ค. s
์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฐพ์๊ธฐ ๋๋ฌธ์ s
๋ t
์ ์๋ธ์ํ์ค๋ผ๊ณ ํ ์ ์๋ค.
์ด ๊ณผ์ ์ ํตํด ๋ณผ ์ ์๋ฏ์ด, ๋ฌธ์๊ฐ ์ผ์นํ๋ ๊ทธ๋ ์ง ์๋ , ์ฐ๋ฆฌ๋ ๊ณ์ํด์ t
๋ด์์ ์์ผ๋ก ๋์๊ฐ๋ค. ๋ฌธ์๊ฐ ์ผ์นํ ๊ฒฝ์ฐ, ํด๋น ๋ฌธ์๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ผ๋ก ๋์๊ฐ์ผ ํ๋ค. ๋ฐ๋ฉด, ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ, ๊ทธ ๋ฌธ์๋ ํ์ํ์ง ์์ผ๋ฏ๋ก ๊ฑด๋๋ด๋ค๊ณ ์๊ฐํ ์ ์๋ค. s
์ ๋ชจ๋ ๋ฌธ์์ ์ผ์นํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ธฐ ๋๋ฌธ์, ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์ฐพ์์ ๋๋ง s
์์ ์์ผ๋ก ๋์๊ฐ๋ค.
1
2
3
4
5
6
7
8
9
10
11
bool isSubsequence(string s, string t) {
int i = 0, j = 0;
while (i < s.size() && j < t.size()) {
if (s[i] == t[j]) {
i++;
}
j++;
}
return i == s.size();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fn is_subsequence(s: String, t: String) -> bool {
let (mut i, mut j) = 0;
let s_chars: Vec<char> = s.chars().collect();
let t_chars: Vec<char> = t.chars().collect();
while i < s_chars.len() && j < t_chars.len() {
if s_chars[i] == t_chars[j] {
i += 1;
}
j += 1;
}
i == s_chars.len()
}
์ด ์๋ฃจ์
์ ์ด์ ์ ๋ชจ๋ ์์ ๋ง์ฐฌ๊ฐ์ง๋ก $O(1)$ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค. ์๊ฐ ๋ณต์ก๋๋ s
์ t
์ ๊ธธ์ด์ ์ ํ์ ์ด๋ค.
๋ง๋ฌด๋ฆฌ
์ฌ๊ธฐ์ ์๊ฐ๋ ๋ฐฉ๋ฒ๋ค์ ๋จ์ํ ๊ฐ์ด๋๋ผ์ธ์ ๋ถ๊ณผํ๋ค. ์๋ฅผ ๋ค์ด, ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์์๋ ํฌ์ธํฐ๋ฅผ ์ฒซ ๋ฒ์งธ ๋ฐ ๋ง์ง๋ง ์ธ๋ฑ์ค์์ ์์ํ์ง๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํฌ์ธํฐ๋ฅผ ๋ค๋ฅธ ์ธ๋ฑ์ค์์ ์์ํ๋ ๋ฌธ์ ์ ์ง๋ฉดํ ์๋ ์๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์์๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์๋ก ๋ค๋ฅธ ๋ ์ ๋ ฅ์ ๋ฐ๋ผ ์ ์ง์์ผฐ๋ค. ๊ฐ๋์ ์ ๋ ฅ ๋ฐฐ์ด/๋ฌธ์์ด์ด ํ๋๋ฟ์ผ ๋๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์์ ์ด๊ธฐํํ๊ณ ๋ ๋ค ์ ์ง์ํค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
ํฌ ํฌ์ธํฐ๋ ์ฃผ๋ก ๋ ๊ฐ์ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต ๊ฐ๋ฅํ ์์๋ค ์ฌ์ด๋ฅผ ์ด๋ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด ๊ธ์์ ๋ค๋ฃฌ ์ ๋ต๋ค์ ๊ฐ์ฅ ํํ ํจํด์ด์ง๋ง, ๋ฌธ์ ์ ๋ค๊ฐ์ค ๋ ํญ์ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ฌ์ง์ด โ์ธ ํฌ์ธํฐโ๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ค๋ ์กด์ฌํ๋ค.
์ด ์ฝ์ค์ ์ฅ๊ณผ ๊ธ๋ค์ ์ด์ ์ฅ์์ ๋ฐฐ์ด ๊ฐ๋ ๋ค์ ์ดํ ์ฅ์ ์ ์ฉํ ์ ์๋๋ก ์์๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ํฌ ํฌ์ธํฐ๋ ์ด ๊ธ์์ ๋ค๋ฃฌ ๊ฒ ์ด์์ผ๋ก ๋ ๋ง์ ํ์ฉ ๋ฐฉ์์ด ์์ผ๋ฉฐ, ์ด๊ฒ์ด ํฌ ํฌ์ธํฐ์ ๋ง์ง๋ง ๋ฑ์ฅ์ ์๋๋ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค.
๋ณด๋์ค ๋ฌธ์
- 344. Reverse String
- 977. Squares of a Sorted Array
- 557. Reverse Words in a String III
- 917. Reverse Only Letters
- 283. Move Zeroes
- 2000. Reverse Prefix of Word
์ถ์ฒ: Leetcode