CS

·CS/백준 풀이
어떤 문제든, 문제를 잘 읽는게 제일 중요하다. 문제를 제대로 안읽어서 BFS로 접근했던 문제 가로, 세로 상황에서 대각선으로 꺾는것을 기준점의 이동 없이 옮기는 줄 알고 여러가지 가능한 경우 중 최단거리의 갯수를 찾는 문제인 줄 알았다. 하지만 이건 DFS이다. 다중 조건 미로찾기라고 생각하면 될 것 같다. 기준점과 움직이는 점을 분리해서 푼 코드이다. import sys input=sys.stdin.readline def bfs(stdx,stdy,mvx,mvy): if mvx==n-1 and mvy==n-1: global c c+=1 return #가로 if stdx==mvx and stdy==mvy-1: if mvy+1
·CS/백준 풀이
다익스트라 알고리즘에 대한 정확한 이해가 없어서 어려웠던 문제. 이 문제를 통해서 개념을 확실히 익혔다. 다익스트라는 dfs와 비슷한 방식으로 작동한다. 최단 경로는 최단 경로의 합이라는 알고리즘으로 작동한다. 따라서 힙을 통해 구현할 수 있다. 약간 조건이 잔뜩붙은 dfs같은 느낌이다. 시작점에서 최단경로를 찾는다 -> 최단경로를 힙에 넣는다 -> 최단경로를 꺼내어 시작점과 중간 경로까지의 값과 비교한 후에 최단 경로가 더 짧은 경우에만 더 진행한다.(이걸로 시간초과가 갈린다.) -> 현재 저장된 중간경로에서 또 다른 경유 지점까지의 합이 저장된 거리보다 짧을 경우, 저장된 거리를 갱신한다. -> 저장된 거리를 힙에 다시 넣는다. 그리고 이 문제의 경우, 특정한 경로를 지나야 하는데 그 발상을 떠올리지..
·CS/백준 풀이
n을 입력하면 n줄에 해당하는 모양을 출력하면 되는 문제. 이전까지의 별찍기와는 달랐다. 나는 출력에만 고집해서 시간을 굉장히 많이 썼는데, 그게 상당히 어렵다는 것을 알게됐다. 모양을 배열로 접근해서 풀었어야 하는 문제. 예를 들어 n=3이면 3*5의 배열을 만들어야 한다. * * * * * * * * 그리고 다음 n=6이면, 6*11의 배열을 만들어야 한다. * * * * * * * * * * * * * * * * * * * * * * * * 중간을 기준으로 보면 첫번째 행의 *은 n=6일땐 5, n=3일때는 2이므로, n-1에 위치함을 알 수 있다. 그렇다면 다음 삼각형이 만들어지는 4번째 행의 위치는 어떤가? 첫번째 기준 값에서 각각 2만큼(n//2-1만큼) 떨어져 있음을 알 수 있다. 이를 통해..
·CS/백준 풀이
플로이드 와샬 알고리즘을 통해 해결했다. 별거 없다. n=int(input()) m=int(input()) road=[[99999999 for _ in range(n+1)] for _ in range(n+1)] for _ in range(m): a,b,c=map(int,input().split()) if road[a][b]>c: road[a][b]=c for t in range(n+1): for x in range(n+1): for y in range(n+1): if road[x][y]>road[x][t]+road[t][y]: road[x][y]=road[x][t]+road[t][y] if x==y: road[x][y]=0 for x in range(1,n+1): for t in road[x][1:]: ..
·CS/백준 풀이
동전으로 돈만들기. 1,2로 7을 만드는 경우를 살펴보면, 1+6을 만드는 경우의 수 2+5를 만드는 경우의 수가 있다. 그런데 이걸 1과 2를 동시에 진행시키면 중복되는 경우가 세지게 된다. 그래서 결론적으로는 피보나치수열처럼 된다. 아래는 잘못 작성한 코드이다. t = int(input()) for i in range(t): n = int(input()) l = list(map(int, input().split())) m = int(input()) dp = [0 for i in range(m + 1)] dp[0] = 1 for x in range(1, m + 1): for t in l: if x - t >= 0: dp[x] += dp[x - t] print(dp) 이것을 1과 2의 경우를 분리해서 진..
·CS/백준 풀이
말만 번지르르하지 별거 없다. 파란 영역 중에 제일 큰 계단을 찾으라는 문제. 아직 스위핑을 안배워서 기본 점수만 받아 보았다. 경우에 따라 잘 나눠서 코딩해주면 된다. 1. 이전값 보다 큰 경우 이전 dp값 +1 2. 이전값과 같은 경우 이전 dp + 0 3. 이전값보다 작을 경우 이전 dp값이 현재 높이보다 작은 경우 : 이전 dp+1 이전 dp값이 현재 높이와 같은 경우 : 이전 dp +0 이전 dp값이 현재 높이보다 클 경우 : 현재 높이값 n=int(input()) h=[0] h.extend(map(int,input().split())) dp=[0 for _ in range(n+1)] dp[1]=h[1] for x in range(1,n+1): if h[x]>h[x-1]: dp[x]=dp[x-1..
·CS/백준 풀이
처음에 수색범위 만큼만 이동할 수 있는 줄 알고 삽질했던 문제;; 알고보니 수색범위안에 있는 곳은 모두 갈 수 있던 거였다. 플로이드-와샬을 통해 해결했다. n에서 시작하여 모든 노드까지의 영역이 기록시켜서 1부터 n까지 수색범위를 넘지 않는 것들의 아이템 수를 더해주면 된다. from collections import deque n, d, r = map(int, input().split()) region = [0] region.extend(list(map(int, input().split()))) m = [[999999 for _ in range(n + 1)] for _ in range(n + 1)] for _ in range(r): a, b, c = map(int, input().split()) m[..
·CS/백준 풀이
오랜만의 bfs, dfs 항상 그렇듯, dfs는 시간초과다. 처음 짠 코드 from collections import deque import sys input=sys.stdin.readline n,m=map(int,input().split()) M=[] for _ in range(n): M.append(list(str(input()))) def bfs(x,y,Mcopy): vismap=[[0 for x in range(m)] for y in range(n)] q=deque() cnt=1 q.append([x,y,cnt]) while q: x,y,cnt=q.popleft() a=[-1,1,0,0] b=[0,0,-1,1] for t in range(4): X=x+a[t] Y=y+b[t] if 0
·CS/백준 풀이
작은 점프, 큰 점프 그리고 단 한번의 매우 큰 점프를 통해 마지막 돌로 가는 최소 에너지를 구하는 문제. 우선 단 한번의 매우 큰 점프를 제외하고 생각했다. 단 한번은 예외처리를 해주면 되니까 라는 생각에서 그랬다. n까지 가는데 드는 최소 에너지 dp(n)은 dp(n-1)+작은점프, dp(n-2)+큰점프 중 큰 값이다. 코드로 구현하면 n=int(input()) d=[[0,0]] for _ in range(n-1): d.append(list(map(int,input().split()))) dp=[0 for x in range(n+1)] if n==1: print(0) exit() elif n==2: print(d[1][0]) exit() dp[2]=d[1][0] dp[3]=min(d[1][0]+d[2..
·CS/백준 풀이
다시한번 타일채우기. 이건 좀 특이한 타일채우기이다. 그래도 여타 타일채우기가 그렇듯, 역시 어렵다. 특이한 점은 이건 홀수일때 0이라는 점이다. n=2일때를 보자. n=3일때는 칸을 다 채울수 없으므로 n=4를 보면, 이렇게 쪼개서 생각 할 수 있다. 그리고 여기에 새로운 모양이 생기는데 바로, 이 두가지이다. 그래서 n(4)=3*n(2)+2=11임을 알 수 있다. 다음은 6이다. 마찬가지로 이렇게 볼 수 있다. 그리고 뒤집으면 이렇게 되는데, 여기서 세주면 전부 겹치고, 아까 n(4)에서 새롭게 만들어진 두개만 카운트 된다는 것을 알 수 있다. 그리고 n(6)의 새로운 모양도 생긴다. 그리고 n=8일때, 경우를 나눠보면 이 세가지인데 이를 통해서 n(8)=n(2)*n(6)+2(새로생긴 모양)*(n(4..
_0422
'CS' 카테고리의 글 목록 (8 Page)