괄호 쌍 맞추기 strict version
class Solution:
def isValid(self, s: str) -> bool:
open_set = set(["(", "[", "{"])
bracket_map = {"(":")","{":"}","[":"]"}
stack = list()
for v in s:
if v in open_set:
stack.append(v)
elif stack and v == bracket_map[stack[-1]]:
stack.pop()
else:
return False
return stack == []
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 != 0:
return False
else:
stack = list()
for v in s:
if v == '(' or v == '{' or v == '[':
stack.append(v)
else:
if not stack:
return False
else:
if v == ')':
if stack.pop() != '(':
return False
elif v == ']':
if stack.pop() != '[':
return False
elif v == '}':
if stack.pop() != '{':
return False
if stack:
return False
return True
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
phone_book | return |
---|---|
[119, 97674223, 1195524421] | false |
[123,456,789] | true |
[12,123,1235,567,88] | false |
입출력 예 #1 앞에서 설명한 예와 같습니다.
입출력 예 #2 한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3 첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
알림
2019년 5월 13일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.
def solution(pb):
book = dict()
for i in range(len(pb)):
book[pb[i]] = i
for i in range(len(pb)):
for j in range(1, len(pb[i])):
if pb[i][:j] in book and book[pb[i][:j]] != i:
return False
return True
O(n + n*k)
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
name | return |
---|---|
JEROEN | 56 |
JAN | 23 |
def solution(name):
size = len(name)
ch = [0] * size
cnt = 0
for i in range(size):
if name[i] != 'A':
ch[i] = 1
cnt += 1
def verticalCheck(target):
down = ord(target) - 65
up = 26 - down
return min(up, down)
def horizonCheck(cur):
cnt1 = 0
left = cur
while True:
left -= 1
cnt1 += 1
if left < 0:
left = size - 1
if ch[left] == 1:
break
cnt2 = 0
right = cur
while True:
right += 1
cnt2 += 1
if right >= size:
right = 0
if ch[right] == 1:
break
if cnt1 >= cnt2:
return [right, cnt2]
else:
return [left, cnt1]
cur = 0
res = 0
while True:
if ch[cur] == 1:
ch[cur] = 0
res += verticalCheck(name[cur])
cnt -= 1
if cnt != 0:
next_cur, step = horizonCheck(cur)
res += step
cur = next_cur
else:
break
return res