๐ง ํฌ ํฌ์ธํฐ (two - pointer)
2๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋จํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์ฃผ๋ก n์ ์ต๋๊ฐ์ด ํฌ๊ฒ ์กํ์๊ณ O(nlog n)์ ์๊ฐ๋ณต์ก๋๋ก ํด๊ฒฐ์ด ํ๋ค ๋, O(n)์ ์๊ฐ๋ณต์ก๋๋ก ๊ตฌํํด์ผ ํ๋ค.
์ด๋, ์์ฃผ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ธ๋ฑ์ค์ ์ข ๋ฃ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํด ์๋ก ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๊ทผํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
๐ง ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ ํฌ์ธํฐ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ํ
๋ฒ์(window)๋ฅผ ์ ์งํ ์ฑ๋ก ์ด๋(sliding)ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋งค์ฐ ๋น์ทํ๋ค.
๐ง ๋ฐฑ์ค 17609 (ํ๋ฌธ) Gold V
๐คซ solution_17609(์๊ฐ์ด๊ณผ)string_list = [input() for _ in range(int(input()))] def palindrome(string): # ํ๋ฌธ์ธ ๊ฒฝ์ฐ if string == string[::-1]: print(0) # ํ๋ฌธ์ด ์๋๊ฒฝ์ฐ else: ans = 2 for i in range(len(string)): new_string = string[:i] + string[i+1:] if new_string == new_string[::-1]: ans = 1 print(ans) for i in string_list: palindrome(i)
๐คซ solution_17609
# ์ ์ฌ ํ๋ฌธ ํ๋จ ํจ์ def palindrome_like(string, left, right): while left < right: if string[left] == string[right]: left += 1 right -= 1 else: return False return True # ํ๋ฌธ ํจ์ def palindrome(string, left, right): while left < right: if string[left] == string[right]: left += 1 right -= 1 else: pseudo1 = palindrome_like(string, left+1, right) pseudo2 = palindrome_like(string, left, right-1) if pseudo1 or pseudo2: return 1 else: return 2 return 0 for string in list([input() for _ in range(int(input()))]): print(palindrome(string, 0, len(string) - 1))
๐ง ๋ฐฑ์ค 1253 (Good Number) Gold IV
๐คซ Algorithm
# ํด๋น ์์๋ฅผ ์ ์ธํ ๋ฆฌ์คํธ์์ ํฌ ํฌ์ธํฐ(Two-Pointer)๋ฅผ ํตํด # ๋ ์์์ ํฉ์ด ์ ํํ ์์์ ๊ฐ์์ง ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค. 1. num ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค. 2. 0๋ถํฐ N - 1 ๊น์ง ๋ฐ๋ณต๋ฌธ์ ํตํด ํน์ ์์(num[i])๋ฅผ ์ ํํ๊ณ , ํด๋น ์์๋ฅผ ์ ์ธํ except_num ๋ฆฌ์คํธ๋ฅผ ์์ฑ 3. except_num ๋ฆฌ์คํธ์์ ํฌ ํฌ์ธํฐ๋ฅผ ํตํด ๋ ์์์ ํฉ(sum)์ด num[i] ์ธ์ง ๋น๊ตํ๋ค. t < num[i]์ด๋ฉด left๋ฅผ ์ฆ๊ฐ t > num[i]์ด๋ฉด right๋ฅผ ๊ฐ์ 4. 2, 3 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๐คซ solution_1253N = int(input()) num = list(map(int, input().split())) num.sort() cnt = 0 for i in range(N): except_num = num[:i] + num[i + 1:] left, right = 0, len(except_num) - 1 while left < right: sum = except_num[left] + except_num[right] if sum == num[i]: cnt += 1 break if sum < num[i]: left += 1 # t ๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํ๋ฏ๋ก left ์ฆ๊ฐ else: right -= 1 # t ๋ฅผ ๊ฐ์์์ผ์ผ ํ๋ฏ๋ก right ๊ฐ์ print(cnt)
๐ง ๋ฐฑ์ค 11003 (์ต์๊ฐ ์ฐพ๊ธฐ, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ด์ฉ) Platinum V
๐คซ Algorithm
ํน์ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ ๋ ์ด ์์๋ณด๋ค ํฐ ๊ฐ์ ์ ์ง๋ ํ์๊ฐ ์๋ค. (์ธ๋ฑ์ค๋ก ๋ณผ ๋์๋ ์๋ก ์ถ๊ฐ๋๋ ์์๊ฐ ๊ฐ์ฅ ์ค๋ ๋จ๊ธฐ ๋๋ฌธ.) ๋ฑ์ผ๋ก ๊ตฌ์ฑํ๊ณ ๋ฑ์ ์์ ํญ์ ์ต์๊ฐ์ด ์ค๋๋กํ๊ธฐ ์ํด ์ฝ์ ์ append๋ฅผ ์ด์ฉํด ๊ฐ๊ณผ ์ธ๋ฑ์ค๋ก ์งํํ๋ค. 1. ์ฝ์ ํ๊ธฐ์ ์ ๋ฑ์ ๋ค์์ while๋ก ์ฝ์ ํ๋ ค๋ ์์๋ณด๋ค ํฐ๊ฐ์ ๋ชจ๋ ์ ๊ฑฐ. (์ฝ์ ํ๋ค๋ฉด ๋ฑ์ ํญ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ฅผ ์๋์ ์ผ๋ก ์ ์งํ ๊ฒ์ด๋ค.) (์ด๋ ์ ๋ ฌ๋ก ์ธํ ์๊ฐ๋ณต์ก๋๋ฅผ ์์ ์ค ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ํ ์ ์๋ค.) 2. ์ถ๊ฐ์ ์ผ๋ก ์ฌ๋ผ์ด๋ฉ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์์๋ค์ ์๊ฐํ๋ฉด ์๋์ ๊ฐ๋ค. ์ฝ์ ํ๊ธฐ์ ์ ๋ฑ์ ์์์๋ถํฐ ๋ณด๋ฉฐ ์ธ๋ฑ์ค ๋ฒ์๊ฐ ๋ฒ์ด๋ ์์๋ค์ ๋นผ์ค๋ค. i) ๋ค์์๋ถํฐ ํ์ธํ๋ฉฐ ์ฝ์ ํ๋ ค๋ ์์๋ณด๋ค ํฐ ๊ฐ๋ค์ ์ ๊ฑฐ ii) ์์์๋ถํฐ ๋ณด๋ฉฐ ์ฌ๋ผ์ด๋ฉ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์์๋ค์ ์ ๊ฑฐ iii) ํ์ฌ ์์ ์ฝ์ ๋ชจ๋ ์ฐ์ฐ์ด O(1)์ผ๋ก ์ ์ฒด ๋ฐฐ์ด์ ํ์ธํ๋๋ฐ O(n)์ผ๋ก ํด๊ฒฐ๊ฐ๋ฅํ๋ค.
๐คซ solution_11003from collections import deque N, L = map(int, input().split()) A = list(map(int, input().split())) dq = deque() for i in range(N): first, end = i - L, i # ํ์ฌ ๋ค์ด์จ ๊ฐ๋ณด๋ค ํฐ ๊ฐ๋ค์ ์ ๊ฑฐํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ while dq and dq[-1][0] > A[end]: # ๋ฑ์ ๋ง์ง๋ง ์์น์์ ํ์ฌ๊ฐ๋ณด๋ค ํฐ ๊ฐ ์ ๊ฑฐ dq.pop() dq.append((A[end], end)) # A, A_idx, ๋ง์ง๋ง ์์น์ ํ์ฌ๊ฐ ์ ์ฅ if dq[0][1] <= first: dq.popleft() print(dq[0][0], end = " ")