
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
โ๏ธ ๋๋ง์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ (=์ฒด๊ณํ)
https://leetcode.com/problems/valid-palindrome/?envType=study-plan-v2&envId=top-interview-150
Valid Palindrome - LeetCode
Can you solve this real interview question? Valid Palindrome - A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric cha
leetcode.com
์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ชจ๋ ๋๋ฌธ์๋ ์๋ฌธ์๋ก ๋ณํํ๊ณ ํน์๋ฌธ์๋ ์ ๊ฑฐํ์ ๋, palindrome์ธ์ง ํ๋ณํ๋ผ.
- ์
๋ ฅ
- s | string := palindrome์ธ์ง ํ๋ณํ ๋ฌธ์์ด, | s | ∈ [1, 2^10^5]
- ์ถ๋ ฅ
- isPalindrome | boolean := palindrome์ธ์ง ์ฌ๋ถ
- ์กฐ๊ฑด
- s๋ ASCII ๋ฌธ์๋ก ์ถ๋ ฅํ ์ ์๋ ๋ฌธ์๋ง ํฌํจํ๋ค.
๐ ์ด๋ค ์์ผ๋ก ์ ๊ทผํ๋๊ฐ?
์ฐ์ palindrome์ ํ๋จํ๊ธฐ ์ ์ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝํ๊ณ , ํน์๋ฌธ์๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค. ํน์๋ฌธ์๋ ์ ๊ท์์ ์ด์ฉํด ์ ๊ฑฐํ์.
์ ๋์ lp์ rp๋ฅผ ๋๊ณ , lp++์ rp--๋ก ์ ์ฐจ ๊ฑฐ๋ฆฌ๋ฅผ ์ขํ๊ฐ๋ฉฐ s[lp]์ s[rp]๊ฐ ์๋ก ๋ฌ๋ผ์ง๋ ์๊ฐ์ false๋ฅผ ๋ฐํํ๋ค.
๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ: ์ ๋ ฅ์ ํฌ๊ธฐ๋ฅผ ๋ฐํ์ผ๋ก
s์ ์ต๋ ๊ธธ์ด๊ฐ 20,000์ด๋ฏ๋ก O(N)๊น์ง ๊ฐ๋นํ ์ ์๋ค. ๋ฐ๋ผ์ ๋จ์ผ for๋ฌธ์ผ๋ก ๊ตฌํํ์.
๐ ์์ฌ ์ฝ๋
lp์ rp๋ฅผ ์ด์ฉํด ์์ชฝ์์ ์ํํ๋ฏ๋ก ๋ฌธ์์ด ๊ธธ์ด์ ์ ๋ฐ๊น์ง๋ง ์ํํ๋ฉด ๋๋ค. ๋ง์ง๋ง์๋ ์ค๊ฐ ์ง์ ์์ ์ข ๋ฃ๋ ๊ฒ์ด๋ค.
s์ ํฌํจ๋ ๋๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ๋ณ๊ฒฝํ๋ค.
s์ ํฌํจ๋ ํน์๋ฌธ์๋ฅผ ์ ๊ฑฐํ๋ค.
lp = 0
rp = ๋ฌธ์์ด ๋งจ ๋
for (0๋ถํฐ, ์ ๋ฐ๊น์ง, 1์ฉ ์ฆ๊ฐ) {
if (s[lp]์ s[rp]๊ฐ ๋ค๋ฅด๋ฉด) {
false ๋ฐํ
}
}
๋ฐ๋ณต๋ฌธ์ ๋ฌด์ฌํ ํต๊ณผํ์ผ๋ฉด true ๋ฐํ
๐ฏ ๊ตฌํ ์ฝ๋
class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();
s = s.replaceAll("[^ใฑ-ใ
ใ
-ใ
ฃ๊ฐ-ํฃa-zA-Z0-9]", "");
int lp = 0;
int rp = s.length() - 1;
for (int i=0; i<s.length()/2; i++) {
if (s.charAt(lp) != s.charAt(rp)){
return false;
}
lp++;
rp--;
}
return true;
}
}
๋ด ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
โฑ ์ฑ๋ฅ ์ธก์ (์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋)
๋จ์ผ for๋ฌธ์ ์ฌ์ฉํ์ฌ ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค.
โ๏ธ ์ฑ๋ฅ ํ๊ณ
N์ ์ต๋ 20,000์ด๋ฏ๋ก ๊ฐ๋นํ ์ ์๋ ๋ฒ์์ด๋ค.
๋ณดํต 1์ด ์ ํ์ด๋ผ๊ณ ํ ๋, O(N)์ ์ฝ 1์ต๊น์ง O(N^2)์ ์ฝ 1๋ง๊น์ง ๊ฐ๋นํ ์ ์๋ค.
๋ฐ๋ผ์ ํด๋น ๋ฌธ์ ๋ฅผ 2์ค for๋ฌธ์ผ๋ก ๊ตฌํํ๋ค๋ฉด ํฐ์ง๊ฒ ๋ ๊ฒ์ด๋ค.
๐ก ๋ฌด์์/์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์๊น?
์ ๊ท์์ ํ์คํ ์์ง ๋ชปํ๋ฉด ๊ตฌํํ ์ ์๋ ์ฝ๋๋ผ๋ ๊ฒ์ด ์์ฝ๋ค.
๊ฐ๋ฅํ๋ฉด ์ ๊ท์์ ์ฌ์ฉํ์ง ์๊ณ ๊ตฌํํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ๋ฐฉ๋ฒ์ด ์ ๋ ์ค๋ฅด์ง ์๋๋ค.
๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
๐ฏ ๊ตฌํ ์ฝ๋
์๋ ์ฝ๋์์๋ ์ ๊ท์์ ์ฌ์ฉํ๋ ๋์ ํน์๋ฌธ์๋ผ๋ฉด ๊ฑด๋๋ด๋ค.
class Solution {
public boolean isPalindrome(String s) {
int lp = 0;
int rp = s.length() - 1;
while (lp <= rp) {
if (!Character.isLetterOrDigit(s.charAt(lp))) {
lp++; // โ
lp๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์๊ฐ ํน์๋ฌธ์๋ผ๋ฉด ๊ฑด๋๋ด๋ค.
} else if (!Character.isLetterOrDigit(s.charAt(rp))) {
rp--; // โ
rp๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์๊ฐ ํน์๋ฌธ์๋ผ๋ฉด ๊ฑด๋๋ด๋ค.
} else {
if (Character.toLowerCase(s.charAt(lp)) != Character.toLowerCase(s.charAt(rp))) {
return false; // ์๋ก ๋ค๋ฅธ๊ฒ ๋์ค๋ฉด ๋ฐ๋ก false ๋ฆฌํด
}
lp++;
rp--;
}
}
return true;
}
}
โฑ ์ฑ๋ฅ ์ธก์ (์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋)
while๋ฌธ์ ์ฌ์ฉํ์ฌ ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค.
์ถ๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
๋๋ ์
์ ๊ท์์ ์ ์ธํ๊ณ ๋ ์ด๋ ต์ง ์์ ๋ฌธ์ ์๋ค.
์ ๊ท์์ ์ค๋๋ง์ ๋ณด๋ ๋ง๋งํ๋ค. ๊ฒฐ๊ตญ ์ด๋ฒ์๋ ๊ฒ์์ ํ์ง๋ง ๋ค์ ์ตํ๋์ด์ผ๊ฒ ๋ค.
์ ๊ท์์ ์ฌ์ฉํ์ง ์๊ณ isLetterOrDigit() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์๋์ด์ผ๊ฒ ๋ค.
'๐ซ ETC > Leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Week 1-2. [Sliding Window] 209. Minimum Size Subarray Sum (Java) (0) | 2023.08.28 |
|---|---|
| Week 1-2. [Two Pointers] 167. Two Sum II - Input Array Is Sorted (Java) (0) | 2023.08.28 |
| Week 1-1. [Array / String] 55. Jump Game (0) | 2023.08.24 |
| Week 1-1. [Array / String] 122. Best Time to Buy and Sell Stock II (0) | 2023.08.24 |
| Week 1-1. [Array / String] 121. Best Time to Buy and Sell Stock (0) | 2023.08.24 |