문제풀이/백준(Boj) 문제풀이 188

[백준][스택] - 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개를 추가해주는 식이다.

[백준][스택] - 2493. 탑

n = int(input()) top = list(map(int,input().split())) answer = [0] * n stack= [] for i in range(n): while stack: if stack[-1][1] > top[i]: answer[i] = stack[-1][0] + 1 break else: stack.pop() stack.append([i, top[i]]) print(*answer) stack에 들어간 값과 현재 값을 비교해서 stack에 들어있는 값이 더 크다면 현재 index + 1(0부터 시작했으니) 해준 값을 answer에 넣어준다. (들어가지 않는다면 자신보다 큰 경우가 없어서 초기화해주었던 값인 0이 그대로 출력된다.) 바로 직전의 값을 stack에 넣어서 뒤에 ..

[백준][이분 탐색] - 10815. 숫자 카드

오답 - 시간 초과 n = int(input()) card = list(map(int,input().split())) m = int(input()) a = list(map(int,input().split())) res = [] for i in a: if i in card: res.append(1) else: res.append(0) for i in res: print(i, end=" ") 문제 풀이 - 이분 탐색 X n = int(input()) card = set(map(int,input().split())) m = int(input()) a = list(map(int,input().split())) for i in a: if i in card: print(1,end = " ") else: print(..

[백준][이분 탐색] - 1654. 랜선 자르기

문제 풀이 k, n = map(int,input().split()) line = [int(input()) for _ in range(k)] lt = 1 rt = max(line) res = 0 while lt = n: lt = mid + 1 res = mid else: rt = mid - 1 print(res) 이 경우엔 길이가 더 작아도 나누면 0이기 때문에 조건에 상관 없이 s 값을 전부 다 구해서 원하는 랜선 갯수가 나오는지 확인한다. 랜선 갯수가 더 많은 경우여도 같은 경우로 생각하기 때문에 계속해서 살펴보며 진행한다.

[백준][이분 탐색] - 2805. 나무 자르기

문제 풀이 n, m = map(int,input().split()) tree = list(map(int,input().split())) lt = 1 rt = max(tree) res = 0 #자른 값과 남은 값이 큰 경우를... 이땐 남은 값이 더 큰 경우를 찾아야 하기에..lt를 증가! while lt = mid: s+= i-mid if s >= m: res = mid lt = mid + 1 else: rt = mid - 1 print(res) 최소한의 나무만 잘라서 원하는 값을 얻어가는 문제로 이분 탐색을 사용해 풀이가 가능하다. 이분 탐색은 구간을 정해 구간의 범위를 좁혀가며 해당 조건을 만족하는 값을 돌려주면 된다. 초기값 설정은 1 ~ 주어진 값의 최댓값을 사용하는 것이 일반적이므로 이 문제도 ..

[백준][수학] - 24480. 알고리즘 수업 - 깊이 우선 탐색 2

import sys input = sys.stdin.readline sys.setrecursionlimit(1000000) def DFS(r): visited[r] = True global cnt path[r] = cnt cnt += 1 for i in graph[r]: if not visited[i]: DFS(i) if __name__ == '__main__': n, m, r = map(int,input().split()) graph =[[] for _ in range(n+1)] visited = [False] * (n+1) cnt = 1 path = [0] * (n+1) for _ in range(m): u,v = map(int,input().split()) graph[u].append(v) grap..

[백준][수학] - 17496. 스타후르츠

if __name__ =="__main__": N, T, C, P = map(int,input().split()) answer = 0 result = ((N-1)//T)*P*C print(result) [메모] 문제 유형이 무엇인지 확인하지 않고 풀기로 했기 때문에 그리디 문제일까 했다. 처음에는 while True문을 사용해서 N(여름 일 수)를 넘으면 종료되는 종료조건을 두고 풀려 했다. 문제를 좀 더 자세히 보니 간단한 식이 있는 문제였고 그에 맞게 풀었다. N(여름 일 수)에서 -1을 해준 이유는 0일부터 시작하는 것이 아닌 1일부터 시작하기 때문입니다.

[백준][그래프] - 2667. 단지번호붙이기

[다시 푸는 문제] [DFS] def DFS(x,y): global danji if x >= n or x = n or y < 0: return False if house[x][y] == 1: danji += 1 house[x][y] = 0 DFS(x,y-1) DFS(x,y+1) DFS(x-1,y) DFS(x+1,y) return True return False if __name__ == "__main__": n = int(input()) house = [] for _ in range(n): house.append(list(map(int,input()))) #연결된 단지가 몇개인지를 확인하기 위한 변수 danji = 0 #연결된 덩어리(단지)를 확인하기 위한 변수 cnt = 0 #연결된 ..