본문 바로가기

python

(50)
[백준] 2169 로봇 조종하기, python https://www.acmicpc.net/problem/2169 처음에는 백트래킹 dfs로 풀려고 했으나 시간초과가 떴다.로봇은 아래, 왼쪽, 오른쪽으로만 이동할 수 있으므로 한 row에 대해서 왼쪽에서 오는 경우, 오른쪽에서 오는 경우를 저장해서 둘 중 큰 값을 dp에 저장하는 방식으로 해결하였다.오른쪽에서 오는 경우는 오른쪽에서 왔을때와 위에서 왔을 때의 최솟값즉 left[현재 row][현재 col]= max( left [현재 row][오른쪽 col] , left [위쪽 row][현재 col]) + 현재칸에 적힌 수 왼쪽에서 오는 경우는 왼쪽에서 왔을 때와 위에서 왔을 때의 최솟값이다.right [현재 row][현재 col]= max( right [현재 row][왼쪽 col] , right [위쪽..
[백준] 2150 Strongly Connected Component, python https://www.acmicpc.net/problem/2150 SCC란 u, v에 대해 u → v, v → u로 가는 경로가 모두 존재하는 최대 정점 집합이다. 즉 양방향으로 고리처럼 연결된 하나의 덩어리 같은 거다. 강한 연결 요소(SCC), 코사라주(Kosaraju) 알고리즘, python 강한 연결 요소(SCC), 코사라주(Kosaraju) 알고리즘, python강한 연결 요소란? 강한 연결 요소, SCC(Strongly connected component)란 방향이 있는 그래프의 정점 u, v에서 u → v, v → u로 가는 경로가 모두 존재하는 최대 정점 집합이다. 즉 양방향으로 연결된 하나의aiden0413.tistory.com 코사라주 알고리즘이란 dfs를 2번 돌면서 그래프..
[백준] 1918 후위 표기식, python https://www.acmicpc.net/problem/1918 결과를 저장할 스택, 연산자를 저장할 스택을 2개가 필요하다. 만약 피연산자라면 바로 결과 스택에 넣는다.여는 괄호라면 연산자 스택에 넣는다.스택이 비어있거나 스택의 최상단이 여는 괄호라면 연산자를 연산자 스택을 넣는다.스택 최상단의 연산자가 넣으려는 연산자의 우선순위보다 높거나 같으면 연산자 스택에서 꺼낸다.예를 들어 현재 스택최상단이 *고 넣으려는 연산자가 +라면 *를 꺼내야 한다. 아래는 A * (B+C)를 변환하는 과정이다.수식 인덱스결과 스택연산자 스택설명A[A][]피연산자는 바로 결과스택에 넣는다.*[A][*]연산자 스택이 비었으므로 넣는다.([A][*(]여는 괄호는 바로 연산자 스택에 넣는다.B[AB][*(]피연산자는 바로 ..
[백준] 1700 멀티탭 스케줄링, python https://www.acmicpc.net/problem/1700 각 전기용품이 사용되는 순서 인덱스를 저장한다.순서가 2, 3, 2, 3, 1, 2, 7이면1은 4에, 2는 0,2,5에, 3은 1,3에 7은 6에 등장하므로 해당 인덱스들을 저장한다플러그 딕셔너리를 생성한다. key=전기용품종류, value=사용되는 순서(배열의 인덱스)로 저장된다.플러그가 비어있다면 전기용품을 꽂고 딕셔너리에 추가하고, 사용 중인 전기용품이면 딕셔너리 인덱스를 늘린다.딕셔너리에 없는 전기용품을 사용할때 현재 사용순서로부터 사용순서가 제일 멀리 떨어진 전기용품을 뽑는다.전기용품사용되는 순서플러그 딕셔너리설명20{2:0}딕셔너리가 비어있으므로 전기용품종류: 사용되는 순서를 넣는다.2:0 을 넣는다.31{2:0, 3:1}플러..
[백준] 1600 말이 되고픈 원숭이, python https://www.acmicpc.net/problem/1600 bfs를 사용해 나이트 사용 횟수가 남아있으면 나이트방향과 동서남북 방향 둘 다 탐색하고, 나이트 사용 횟수가 없으면 동서남북 방향만 탐색해서 해결했다. import sysfrom collections import dequeinput = sys.stdin.readlinek = int(input())w, h = list(map(int, input().split()))board = [list(map(int, input().split())) for _ in range(h)]dx = [0,0,1,-1] dy = [1,-1,0,0]horsex = [-1,-2,-2,-1,1,2,2,1]horsey = [-2,-1,1,2,2,1,-1,-2]vis..
[백준] 1405 미친 로봇, python https://www.acmicpc.net/problem/1405 백트래킹을 사용해 모든 경로를 구한다.4 방향에 대해 다음 좌표를 정한다. 확률이 0인 방향은 제외한다.만약 현재 좌표가 범위밖이거나 방문했던 좌표라면 건너뛴다.dfs를 통해 탐색한 모든 경로는 단순한 경로임이 보장된다.import sysinput = sys.stdin.readlinearr = list(map(int, input().split()))n = arr[0]p = [x/100 for x in arr[1:]]visited = [[False for _ in range(2*n+1)] for _ in range(2*n+1)]answer = 0def dfs(cx,cy,route,prob): global answer if ro..
[백준] 1103 게임, python https://www.acmicpc.net/problem/1103 처음에는 bfs를 사용해서 다음 위치를 선택해서 방문했던 위치면 무한루프고, bfs종료 시 최대 이동 횟수를 출력했더니 오답이 나왔다.dfs로 바꾸고 dp[i][j] 번째에 i, j번째까지 도달하는데 걸리는 이동 횟수를 저장했더니 시간초과가 나왔다.dp [i][j]를 i, j에서 시작해서 최대로 이동할 수 있는 횟수로 변경하였다.dp [현재 i][현재 j] = dp [다음 i][다음 j]의 최댓값 + 1으로 dfs를 탐색하여 해결하였다.import syssys.setrecursionlimit(10**6)n, m = list(map(int, input().split()))board = [[x for x in input()] for _ i..
[백준] 1079 마피아, python https://www.acmicpc.net/problem/1079 백트래킹을 사용해 구현하였다.낮일 때는 유죄지수 최댓값의 생존자를 배열에서 제거한다.밤일 때는 생존자 배열을 순차적으로 돌면서 한 명을 제거하고, 유죄지수를 갱신한다.생존자배열이 1이거나(은진이만 생존) 은진이가 죽었을때 day값의 최댓값을 구한다.위 과정을 백트래킹으로 구현하였다. import sysinput = sys.stdin.readlinen = int(input())score = list(map(int, input().split()))r = [list(map(int, input().split())) for _ in range(n)]num = int(input())survivor = [x for x in range(n)]def ..