๋ฌธ์
๋ฆฟ์ฝ๋ 921. Minimum Add to Make Parentheses Valis
https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/
์ฝ๋
class Solution(object):
def minAddToMakeValid(self, s):
s = deque(s)
stack = []
item = s.popleft()
stack.append(item)
while s:
item = s.popleft()
if not stack:
stack.append(item)
else:
if item == ')' and stack[-1] == '(':
stack.pop()
else:
stack.append(item)
return len(stack)
ํ์ด
s = deque(s)
s์ ๊ธ์๋ค์ ์ผ์ชฝ๋ถํฐ ํ๋์ฉ ๊บผ๋ผ๊ฒ์ด๊ธฐ ๋๋ฌธ์ s๋ฅผ ํ ํํ๋ก ๋ฐ๊พผ๋ค.
stack = []
item = s.popleft()
stack.append(item)
์คํ ๋ฐฐ์ด์ ์ด๊ธฐํ ์์ ์ ํ๋ค.
์คํ์ ํ๋ ์์ฑํ๊ณ , s์ ์ผ์ชฝ์์ ๊ธ์๋ฅผ ํ๋ ๋ผ์(=popleft() ํด์) ์คํ์ ๋ฃ์ด์ค๋ค.
while s:
s์์ ์์๋ค์ ํ๋์ฉ ๋ผ์ ์คํ์ ๋ฃ์ด์ฃผ๋ ์์ ์ ํ ๊ฒ์ด๋ค.
๊ทธ๋์ s์ ์์๊ฐ ์์๋๊น์ง ๋ค์์ ์์ ์ ๋ฐ๋ณตํ๋ค.
if not stack:
stack.append(item)
else:
if item == ')' and stack[-1] == '(':
stack.pop()
else:
stack.append(item)
s์ ์ผ์ชฝ ์์๋ฅผ ํ๋ ๋ผ์ item ๋ณ์์ ์ด๊ธฐํํ๋ค.
๋ง์ฝ stack์ ์์๊ฐ ๋ค์ด์์ง ์๋ค๋ฉด
item์ stack์ ์ถ๊ฐํ๋ค.
stack์ ์์๊ฐ ๋ค์ด์๋ค๋ฉด
์คํ์ ๋งจ ๋ง์ง๋ง ์์๊ฐ '('์ด๊ณ item์ด ')'์ฌ์ ๊ดํธ๊ฐ ์ง์ ์ง๋๋ค๋ฉด, stack์ ๋ง์ง๋ง ์์๋ฅผ popํ๋ค.
๊ดํธ๊ฐ ์ง์ง์ง ์๋๋ค๋ฉด stackdp item์ ์ถ๊ฐํ๋ค.
return len(stack)
์คํ์๋ ์ง์ ์ง์ง ๋ชปํ ๊ดํธ๋ง ๋จ์์์๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ดํธ๋ค์ ๋ชจ๋ '('์ด๊ฑฐ๋ ')' ๋ ์ค ํ๋์ผ๊ฒ์ด๋ค.
stack์ ๋จ์์๋ ๊ดํธ์ ์ ๋งํผ ๊ทธ์ ๋์ํ๋ ๊ดํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๊ดํธ๊ฐ ์ง์ด ์ง์ด์ง๋ค.
ex 1 ) stack์ ๋จ์์๋ ๊ดํธ๋ค = ['(', '('] โก๏ธ ์ถ๊ฐํด์ผํ๋ ๊ดํธ = ')', ')'
ex 2 ) stack์ ๋จ์์๋ ๊ดํธ๋ค = [')', ')', ')', ')', ')', ')'] โก๏ธ ์ถ๊ฐํด์ผํ๋ ๊ดํธ = '(', '(', '(', '(', '(', '('
๋ฐ๋ผ์ ์คํ์ ๋จ์์๋ ์์ง ์ง์ง์ด์ง์ง ๋ชปํ ๊ดํธ์ ์ซ์๊ฐ ๋ฌธ์ ์ ์ ๋ต์ผ๊ฒ์ด๋ค.
๋ค๋ฅธ ์ฝ๋
class Solution(object):
def minAddToMakeValid(self, s):
return abs(s.count('(') - s.count(')'))
โฌ๏ธ์์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ํด์ฌ๋ฅผ ์ด์ฉํ ์ฝ๋
class Solution(object):
def minAddToMakeValid(self, s):
dic = {'(': 0, ')': 0}
for letter in s:
if letter == '(':
dic['('] += 1
else:
dic[')'] += 1
return abs(dic['('] - dic[')'])
ํ์ด
์คํ/ํ ๊ฐ๋ ์ ์ฌ์ฉํ์ง ์์๋ค.
return abs(s.count('(') - s.count(')'))
๋ฌธ์ ์ ์กฐ๊ฑด ์ค "In one move, you can insert a parenthesis at any position of the string" ์ด๋ผ๋ ์กฐ๊ฑด์ด ์๋ค.
๋ฌธ์์ด์ ์๋ฌด ์์น์๋ ๊ดํธ๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๋ป์ด๋ค.
๊ทธ๋์ ์ง์ง์ด์ง๋ '('์ ')'๋ฅผ ๋นผ๊ณ ๋จ๋ ๊ดํธ์ ์๋ฅผ ๋ฐํํ๋ฉด ์ ๋ต์ด ๋์จ๋ค.
์ด ์ฝ๋์ ์๊ฐ ๋ณต์ก๋๋ O(2n)์ด๋ค.
count()๊ฐ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
s.count('(') โก๏ธ O(n)
s.count(')') โก๏ธ O(n)
๋์ด ํฉํด์ O(2n)์ด๋ค.
ํด์ ํ์ด๋ธ์ ์ฌ์ฉํด์ count()๋ฅผ ์ฐ์ง ์๊ณ ์์์ ์๋ฅผ ์ธ๋ฉด O(2n)์์ O(n)์ผ๋ก ์ค์ผ ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋์ ํด์๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ค์ ์ง๋ดค๋ค.
dic = {'(': 0, ')': 0}
'('์ ๊ฐ์๋ 0,
')'์ ๊ฐ์๋ 0 ์ผ๋ก ์ด๊ธฐํํ๋ค.
for letter in s:
if letter == '(':
dic['('] += 1
else:
dic[')'] += 1
s๋ฌธ์์ด์ ํ๊ธ์์ฉ ๋์๊ฐ๋ฉด์
ํด๋น ๊ธ์๊ฐ '('์ด๋ฉด dic['(']์ ๋ฐธ๋ฅ๋ฅผ 1 ์ฆ๊ฐ์ํค๊ณ
ํด๋น ๊ธ์๊ฐ ')'์ด๋ฉด dic['(']์ ๋ฐธ๋ฅ๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
return abs(dic['('] - dic[')'])
์ง์ง์ด์ง๋ '('์ ')'๋ฅผ ๋นผ๊ณ ๋จ๋ ๊ดํธ์ ์๋ฅผ ๋ฐํํ๋ค.
์๋กญ๊ฒ ๋ฐฐ์ด์ / ๋๋์
- ์ค์ ๋ก๋ count()ํ์ฉ ํจ์๋ณด๋ค ํด์ ํ์ฉ ํจ์๊ฐ ์๊ฐ์ด 2ms ๋ ๊ฑธ๋ ธ๋ค. count() ํ์ฉ ์ฝ๋๋ O(2n)์ด๊ณ , ํด์ ํ์ฉ ์ฝ๋๋ O(n)์ธ๋ฐ ์ ํด์ ํ์ฉ ์ฝ๋๊ฐ ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด๊น? ์ด์ ๋ ํ์ด์ฌ์ ์ธํฐํ๋ฆฌํฐ(ํ์ด์ฌ ์ฝ๋๋ฅผ ์คํํ๋ ํ๋ก๊ทธ๋จ)์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ฒ์ ์ฐจ์ด ๋๋ฌธ์ด๋ค.
- ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ ๋ด์ฅํจ์(count() ๋ฑ)์ ๋ํด ์ต์ ํ๋ฅผ ๋ง์ด ์ํํ๋ค.
- ๋ฐ๋ฉด์ ํด์๋ก ์์ฑ๋ ์ฝ๋์์๋ ๋ด๊ฐ ์ ์ํ ๋ ผ๋ฆฌ๋ก ๋ฐ๋ณต๋ฌธ์ ์ํํ๊ธฐ ๋๋ฌธ์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ต์ ํ ํ ์ ์๋ ๋ถ๋ถ์ด ์๋์ ์ผ๋ก ์ ๋ค.
- count()๋ฅผ ์ฌ์ฉํ ์ฝ๋์์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ด ๋จ์ํ๋ค. ๋จ์ํ ๋ฌธ์์ด์ 2๋ฒ ์ํํ๋ค.
- ๋ฐ๋ฉด์ ํด์๋ฅผ ์ฌ์ฉํ ์ฝ๋์์๋ ๋ฌธ์์ด์ ์ํํ๋ฉด์ ๋์ ๋๋ฆฌ์๋ ์ ๊ทผํ๋ค. ์ด๋ ์ฝ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- ํ์ง๋ง ์ฃผ์ด์ง๋ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ค๋ฉด ํด์๋ฅผ ์ด์ฉํ ์ฝ๋๊ฐ ๋ ์ ๋ฆฌํ๋ค. (์ค์ ์ฑ๋ฅ์ ๊ตฌํ๋ ํ๊ฒฝ ๋ฐ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์ ์ต์ ํ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค.)
# ์ฑ๋ฅ ํ
์คํธ ์ฝ๋
import time
class Use_count(object):
def minAddToMakeValid(self, s):
return abs(s.count('(') - s.count(')'))
class Use_hash(object):
def minAddToMakeValid(self, s):
dic = {'(': 0, ')': 0}
for letter in s:
if letter == '(':
dic['('] += 1
else:
dic[')'] += 1
return abs(dic['('] - dic[')'])
# input_string = "๋ฌธ์์ด ๋ฃ์ผ์์ค~~"
# count ์ผ์๋ ์คํ ์๊ฐ ์ธก์
use_count = Use_count()
start_time = time.time()
use_count.minAddToMakeValid(input_string)
print("count ์ผ์๋ ์คํ ์๊ฐ:", time.time() - start_time)
# ํด์ ์ผ์๋ ์คํ ์๊ฐ ์ธก์
use_hash = Use_hash()
start_time = time.time()
use_hash.minAddToMakeValid(input_string)
print("ํด์ ์ผ์๋ ์คํ ์๊ฐ:", time.time() - start_time)
- ํ๋ก๊ทธ๋๋จธ์ค <์ฌ๋ฐ๋ฅธ ๊ดํธ> ๋ฌธ์ ์ ๋น์ทํ๋ค๊ณ ๋๊ผ๋ค. (์ฌ๋ฐ๋ฅธ ๊ดํธ TIL : https://hyein6604444.tistory.com/22)
๋ค๋ฅธ ์๊ฒฌ์ด๋ ๊ถ๊ธํ์ ๊ฒ ์๋ค๋ฉด ํธํ๊ฒ ๋๊ธ ๋ฌ์์ฃผ์ธ์ :)
'์ฝ๋ฉํ ์คํธ๐ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฆฟ์ฝ๋] Reduce Array Size To The Half (0) | 2024.06.27 |
---|---|
[๋ฆฟ์ฝ๋] Seat Reservation Manager (0) | 2024.06.26 |
[๋ฆฟ์ฝ๋] Removing Stars From a String (0) | 2024.06.24 |
[๋ฆฟ์ฝ๋] Find the Winner of the Circluar Game (0) | 2024.06.22 |
[๋ฐฑ์ค] ๊ฑธ๊ทธ๋ฃน ๋ง์คํฐ ์ค์์ด (0) | 2024.06.21 |