문제풀이 324

[프로그래머스][스택/큐] - 올바른 괄호(파이썬/python)

문제 풀이 def solution(s): answer = True stack = [] for i in s: if stack: if i == "(": stack.append(i) else: if stack[-1] == "(": stack.pop() else: stack.append(i) if len(stack) !=0: answer = False return answer 해당 문제는 "()"가 한 짝일 때만 괄호라고 보기에 따로 ")(" 일 경우는 판단하지 않아도 된다. "("는 전부 stack에 넣어주며 진행하고 이때, stack[-1] 지점의 문자와 해당 for문을 도는 문자의 () 짝이 맞다면 스택에 있는 문자는 빼준다. 결과적으로 짝이 맞다면 그대로 answer = True를 반환할 것이고 맞지 않..

[백준][파이썬] - 1764. 듣보잡(파이썬/python)

풀이 1 n, m = map(int,input().split()) d= {} for i in range(n): name = input() d[name] = 1 for i in range(m): name = input() if name not in d: d[name] = 1 else: d[name] = d[name] +1 res = [] for dic in d: if d[dic] == 2: res.append(dic) res.sort() print(len(res)) for r in res: print(r) 듣도 못한 사람을 키로 값을 1로 만들어 체크해준다. 보도 못한 사람 중 듣도 못한 사람과 겹치면 해당 값에 +1 해준다. 이때 값이 2인 키들만 res 리스트에 담아주고 이를 오름차순으로 출력하기 위해..

[백준][파이썬] - 10816. 숫자 카드 2(파이썬/python)

딕셔너리 사용 풀이 from collections import defaultdict int(input()) num = list(map(int,input().split())) int(input()) num2 = list(map(int,input().split())) res = defaultdict(int) for n in num: res[n] += 1 for x in num2: if x in res: print(res[x], end=" ") else: print(0, end=" ") defaultdict를 사용한 이유는 for문을 사용할 때 특정 키에 값을 += 1해주는 작업을 위해서다. 이때 그냥 딕셔너리를 쓰게 된다면? if not n in res: res[n] = 0 res[n] += 1 위와 같이 ..

[백준][파이썬] - 13417. 카드 문자열(파이썬/python)

from collections import deque for _ in range(int(input())): n = int(input()) s = input().split() dq = deque(s) res = deque(dq.popleft()) while dq: now = dq.popleft() if now > res[0]: res.append(now) else: res.appendleft(now) print("".join(res)) A가 대문자 중 가장 작은 문자라고 한다면 현재 문자와 앞에 제일 앞에 담겨있는 문자 중 더 큰 값은 뒤로 보내고 현재 res 안에 제일 작은 문자는 제일 앞으로 보낸다. 두 개의 덱 자료구조를 쓰는 이유는 간단하다.(둘 다 모두 덱으로 진행해야 한다. 리스트의 경우엔 po..

[백준][스택] - 1935. 후위 표기식2(파이썬)

오답! #해당 수를 해당 문자에 매칭시키고 후위 연산을 진행해준다. n = int(input()) s = list(input()) cnt = 1 stack = [] for _ in range(n): int(input()) for i in range(len(s)): if s[i].isalpha(): s[i] = str(cnt) cnt += 1 for x in s: if x.isdigit(): stack.append(float(x)) else: if x == "+": b = stack.pop() a = stack.pop() stack.append(a+b) elif x == "-": b = stack.pop() a = stack.pop() stack.append(a-b) elif x == "*": b = st..

[백준][스택] - 1918. 후위 표기식(파이썬)

s = input() stack = [] res = "" for i in s: if i.isalpha(): res += i else: #연산자인 경우 if i == "(": stack.append(i) elif i == "+" or i == "-": while stack and stack[-1] != "(": res += stack.pop() stack.append(i) elif i == "*" or i == "/": while stack and (stack[-1] =="*" or stack[-1] == "/"): res += stack.pop() stack.append(i) elif i == ")": while stack and stack[-1] != "(": res += stack.pop() stac..

[백준][스택] - 10799. 쇠막대기(파이썬)

#쇠막대기 s= input() stack = [] cnt = 0 for i in range(len(s)): if s[i] == "(": stack.append(s[i]) else: #어차피 )인 경우엔 pop해주어야 한다. stack.pop() if s[i-1] != ')': cnt += len(stack) else: cnt += 1 print(cnt) 잘 살펴보면 레이저로 끊는 부분은 해당 막대기 갯수만큼 쌓인다. 이는 stack에 쌓인 "(" 여는 괄호의 갯수와 동일하다. ")" 뒤에 또 닫는 괄호가 올 땐 해당 막대기의 끝 부분을 의미한다. 이때는 더이상 막대기가 진행되지 않으므로 끄트머리 1개를 추가해주는 식이다.