< All posts

3006. Find Beautiful Indices in the Given Array I

๋ฌธ์ œ ์„ค๋ช…

์ด ๋ฌธ์ œ๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์•„๋ฆ„๋‹ค์šด ์ธ๋ฑ์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • 0 <= i <= s.length - a.length
  • s[i..(i + a.length - 1)] == a
  • There exists an index j such that:
    • 0 <= j <= s.length - b.length
    • s[j..(j + b.length - 1)] == b
    • |j - i| <= k

์ฆ‰, ์•„๋ฆ„๋‹ค์šด ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • ์ธ๋ฑ์Šค i์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด a์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ธ๋ฑ์Šค j์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด b์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ธ๋ฑ์Šค i์™€ j ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ k ์ดํ•˜์ด์–ด์•ผ ํ•œ๋‹ค.

3006

ํ’€์ด ๋ฐ ํ•ด์„ค

  • ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.
  1. ๋ฐฐ์—ด s๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด a์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ณ , b์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ์ด์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ a์™€ b์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค ์Œ์„ ๋น„๊ตํ•˜๊ณ , |j - i| <= k ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ ํ’€๋ฆฌ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N^2)์œผ๋กœ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€์ด 1

class Solution:
    def beautifulIndices(self, s: str, a: str, b: str, k: int) -> List[int]:
        na, nb = len(a), len(b)
        a_indices = []
        b_indices = []

        for i in range(len(s)):
            # find indexes of occurrences str a
            if i+na<=len(s) and s[i:i+na]==a:
                a_indices.append(i)

            # find indexes of occurrences str b
            if i+nb<=len(s) and s[i:i+nb]==b:
                b_indices.append(i)
        
        ans = []
        for i in a_indices:
            for j in b_indices:
                if abs(j-i) <= k:
                    ans.append(i)
                    break
        
        return ans

tc-bad

๋”ฐ๋ผ์„œ, ๋‘๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ์ด์ค‘ for๋ฌธ์„ ๋Œ€์‹ ํ•˜์—ฌ bisect๋ฅผ ์“ฐ๋ฉด O(N)์„ O(N log N)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€์ด 2 - Bisect ํ™œ์šฉ

class Solution:
    def beautifulIndices(self, s: str, a: str, b: str, k: int) -> List[int]:
        na, nb = len(a), len(b)
        a_indices = []
        b_indices = []

        for i in range(len(s)):
            # find indexes of occurrences str a
            if i+na<=len(s) and s[i:i+na]==a:
                a_indices.append(i)

            # find indexes of occurrences str b
            if i+nb<=len(s) and s[i:i+nb]==b:
                b_indices.append(i)
        
        ans = []
        for i in a_indices:
            for j in b_indices:
                if abs(j-i) <= k:
                    ans.append(i)
                    break
        
        return ans

Complexity Analysis

tc

์‹œ๊ฐ„ ๋ณต์žก๋„

  • O(N log N): ๋ฐฐ์—ด s๋ฅผ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋Š”๋ฐ O(N)์ด ๊ฑธ๋ฆฌ๊ณ , bisect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ a์˜ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด b์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” ๋ฐ O(log N)์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ณต๊ฐ„ ๋ณต์žก๋„

  • O(N): a์™€ b์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Constraint Analysis

Constraints:
1 <= k <= s.length <= 10^5
1 <= a.length, b.length <= 10
s, a, and b contain only lowercase English letters.

References

ยฉ 2025 HyunJoon Sung. All Rights Reserved.

GitHub