๐Ÿ’ซ ETC/Leetcode

Week 1-2. [Two Pointers] 125. Valid Palindrome (Java)

ming412 2023. 8. 26. 00:22

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

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() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋‘์–ด์•ผ๊ฒ ๋‹ค.