본문 바로가기
728x90
반응형

전체 글647

백준 1149번: RGB 거리 """ 1번집: rgb중 가장 싼거 2번집: (1번집에서 안한색 中 가장싼거 + 1번집가격) or (2번집 중 가장싼거 + 2번집에서 안한 색 중 1번집 가장싼거) 둘 중 더 싼거 """ n=int(input()) #집의 수 r=[]#빨간집을 칠하는 비용들 g=[]#초록집을 칠하는 비용들 b=[]#파란집을 칠하는 비용들 for i in range(n): R,G,B=map(int,input().split()) r.append((R,0)) g.append((G,1)) b.append((B,2)) #각 행의 1번 인덱스는 색을 표현함 data=[[0]*2 for i in range(n)] def C_rgb(i): if r[i][0] < g[i][0]: if r[i][0] 2022. 7. 26.
백준 16234번: 인구 이동 https://www.acmicpc.net/problem/16234 16234번: 인구 이동 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모 www.acmicpc.net 문제 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모든 나라는 1×1 크기이기 때문에, 모든 국경선은 정사각형 형태이다. 오늘부터 인구 이동이 시작되는 날이다. 인구 이동은 하루 동안 다음과 같이 진행되고, 더 이상 아래 방법에.. 2022. 7. 26.
백준 1654번: 랜선 자르기 https://www.acmicpc.net/problem/1654 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 www.acmicpc.net 문제 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다. 이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예.. 2022. 7. 25.
백준 16236번: 아기상어 from collections import deque n=int(input()) graph=[] for i in range(n): graph.append(list(map(int,input().split()))) for i in range(n): for j in range(n): if graph[i][j]==9: #아기상어의 위치 shark_x,shark_y=i,j #아기상어의 위치 저장 graph[i][j]=0 #빈칸으로 변경 level=2 dx=[1,-1,0,0] dy=[0,0,1,-1] def bfs(x,y,level): visited=[[0]*n for i in range(n)] dist=[[0]*n for i in range(n)] queue=deque() queue.append((x,y)) vi.. 2022. 7. 25.
백준 16236번: 아기상어 (실패) from collections import deque n=int(input()) field=[] for i in range(n): field.append(list(map(int,input().split()))) for i in range(n): for j in range(n): if field[i][j]==9: baby_shark=(i,j,2) #좌표와 크기 visited=[[0]*n for i in range(n)] dx=[-1,0,0,1] dy=[0,-1,1,0] def bfs(): global visited exp=0 queue=deque() queue.append(baby_shark) x1,y1,z=baby_shark visited[x1][y1]=1 #방문표시 time=0 while queue: .. 2022. 7. 25.
백준 2470번: 두 용액 https://www.acmicpc.net/problem/2470 2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00 www.acmicpc.net 문제 KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다. 산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다. 같은 양의 두 용액을 혼합한 용액의 .. 2022. 7. 21.
백준 11726번: 2xN 타일링 https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 문제 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. n=int(input()) d=[0]*1001 d[0]=0 d[1]=1 d[2]=2 #n.. 2022. 7. 21.
백준 9095번: 1,2,3 더하기 https://www.acmicpc.net/problem/9095 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 숫자 n을 1,2,3으로 만들기 위해서 1+(n-1) 2+(n-2) 3+(n-3) 을 할 수 있다. t=int(input()) d=[0]*11 d[1]=1 #1 d[2]=2 #1+1, 2 d[3]=4 .. 2022. 7. 21.
백준 2206번: 벽 부수고 이동하기 https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net 문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한.. 2022. 7. 21.
백준 10816번: 숫자 카드2 https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 문제 숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다... 2022. 7. 20.
백준 1920번: 수 찾기 https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net 문제 N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. 입력 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에.. 2022. 7. 20.
다이나믹 프로그래밍: 바닥 공사 가로의 길이가 N, 세로의 길이가 2인 직사각형 형태의 얇은 바닥이 있다. 이 바닥을 1x2의 덮개, 2x1의 덮개, 2x2의 덮개를 이용해 채우고자 한다. 이때 바닥을 채우는 모든 경우의 수를 구하라. n=int(input()) d=[0]*1000000 d[1]=1 d[2]=3 for i in range(3,n+1): d[i]=d[i-1] + d[i-2]*2 print(d[n]) d [i]=가로가 i일 때 바닥을 채우는 모든 경우의 수 d [i]=d [i-1] + d [i-2]*2 가로가 i일 때.. "i-1까지의 것" + "2x1 짜리 타일 1개"로 구성할 수도 있고 "i-2까지의 것" + "2x2 짜리 타일 1개"로 구성할 수도 있고 "i-2까지의 것" + "1x2 짜리 타일 2개"로 구성할 수도 .. 2022. 7. 20.
다이나믹 프로그래밍: 효율적인 화폐 구성 n종류의 화폐가 있다. 이 화폐들을 최소한으로 이용해서 m원을 만들 때 필요한 화폐의 개수는? 앞서 배운 다이내믹 프로그래밍 예제들처럼 보텀업 방식을 이용했다. 반복문을 이용하여 0원~m원까지 필요한 화폐 수를 차근차근 구하고, 이미 구했던 화폐 수를 이용하여 다음 값을 찾는 식으로 구성했다. n,m=map(int,input().split()) #화폐종류 n개, 목표 M원 list_coin=[] for i in range(n): list_coin.append(int(input())) d=[-1]*10001 for i in list_coin: d[i]=1 #동전 1개로 사용가능한 것 초기화함 for i in range(min(list_coin)+1,m+1): count=0 for coin in list_c.. 2022. 7. 19.
백준 1463번: 1로 만들기 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. x=int(input()) #숫자입력 d=[0]*10000001 for i .. 2022. 7. 19.
다이나믹 프로그래밍: 1로 만들기 숫자 x를 입력받는다. x가 5로 나누어 떨어지는 경우 5로 나눌 수 있고, 3으로 나누어 떨어지는 경우 3으로 나눌 수 있고, 2로 나누어 떨어지는 경우 2로 나눌 수 있으며, 그냥 -1을 할 수도 있다. 이 네가지 연산을 사용하여 x를 1로만드는 최소 연산 횟수를 구하라. 처음에는 x에서 5로 나눌 수 있으면 5로 나누고, 3으로 나눌수 있으면 3으로 나누고..하는식으로 무조건 큰걸로 나눌 수 있으면 더 빨리 1이 나올거라 생각했는데, 그건 아니었다 x=int(input()) #숫자입력 d=[0]*30001 #d[n]은 숫자n이 1이 될 때까지의 연산 횟수를 저장함 #bottom up for i in range(2,x+1): d[i]=d[i-1]+1 #i에서 (-1)연산 한번만 하면 i-1이 되므로,.. 2022. 7. 19.
다이나믹 프로그래밍: 개미 전사 리스트에 값이 들어있는데, 몇 개의 칸을 선택해서 선택한 칸들의 값의 합을 최대로 만들어야한다. 조건: 칸을 선택할 때 인접한 칸을 선택할 수 없다 x=int(input()) k=list(map(int,input().split())) d=[0]*3001 d[0]=k[1] #1번창고까지의 최대 식량 d[1]=max(k[1],k[2]) #2번창고까지의 최대 식량 for i in range(2,x): d[i]=max(d[i-1],d[i-2]+k[i]) #이전것까지의 식량 vs 전전것+이번것까지 식량 print(d[x-1]) 식량창고의 개수가 x 각 식량창고에 있는 식량의 크기를 저장할 리스트 k=[] n번째 식량창고까지 있다고 가정했을 때 최대로 훔칠 수 있는 식량의 양=d[n] d[i]= max(d[n-1].. 2022. 7. 19.
다이나믹 프로그래밍 이미 계산된 결과(작은 문제)는 별도의 메모리 공간에 저장해 둠으로써 중복 연산을 줄여 수행시간을 줄일 수 있다 다이나믹 프로그래밍을 사용할 수 있는 조건 1. 최적 부분 구조: 큰 문제를 작은 문제로 나눌 수 있고, 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다 2. 중복되는 부분 문제: 동일한 작은 문제를 반복적으로 해결해야 함 다이나믹 프로그래밍 방식으로는 1. 탑다운(메모이제이션) 2. 보텀업 두가지가 있다. 탑다운 방식은 큰 문제를 해결하기 위해 작은 문제를 호출하는 방식이고, 보텀업 방식은 단순히 반복문을 이용하여 작은 문제부터 차근차근 답을 도출하는 방식이다. 탑다운 방식은 보통 재귀함수를 이용하는데, 재귀함수 깊이 제한 때문에 문제가 생길 수 있으므로 보텀업 방식을 권장한다. 고한다... 2022. 7. 19.
허브딜 꽃대가 올라옴 오늘 화분보는데 허브딜 꼭대기에 뭔 노란 덩어리가 생겼음 자세히보니까 꽃 필려고 하는거같음 허브딜 3월부터 키웠으니까 지금까지 한 4개월 넘음 잘자라다가 또 흐물흐물해졌다가 쪼그라들다가 어떤건 먹고 어떤건 갖다버리고 했는데 마지막남은 한마리가 꽃을 피게 생김 씨앗 심고 한달됐을때 사진인듯 이건 두달쯤 자란 사진이다. 이땐 아주 팔팔하게 잘 자람. 대나무같음. 근데 좀 휘청휘청함 잘자라는건 대나무처럼 잘자라는데 못자라는건 바닥을 기어감 그래서 몇개는 해먹고 몇개는 뽑고 하나는 물에다가 수경재배 하기로 했다 근데 뭔가 뿌리에 문제가 있었나봄 수경재배 시작한 애는 갑자기 팔팔해지고 흙에 계속 키우던애들은 다 말라서 죽음 그렇게 수경재배 한마리 빼고 허브딜 다 죽음 근데 어느날 공부하고 집 들어왔는데 잘자라던 .. 2022. 7. 18.
이진 탐색: 떡볶이 떡 만들기 떡을 자르기 위해 칼날의 높이를 설정해야 한다. 길이가 일정하지 않은 여러개의 떡이 있는데, 떡이 칼날 높이보다 높으면 잘린 만큼 떡을 가져갈 것이고 떡이 칼날 높이보다 낮으면 잘리지 않는다. 떡의개수n,필요한 떡의 총 길이m을 첫 줄에 입력받고 두번째 줄에서 떡의 개별 높이를 한 줄에 입력받는다. m만큼의 떡을 얻기 위해 최대한으로 높일 수 있는 칼날의 높이를 구하라. n,m=map(int,input().split()) #떡의개수n, 용청한 떡의길이m h=list(map(int,input().split())) #개별떡의길이 k=max(h)-1 #절단기 높이 초기값 for kal in range(k,0,-1): sum=0 for teok in h: if teok>kal: sum+=teok-kal if s.. 2022. 7. 18.
백준 2468번: 안전 영역 https://www.acmicpc.net/problem/2468 2468번: 안전 영역 재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 www.acmicpc.net 문제 재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 안전한 영역이 최대로 몇 개가 만들어 지는 지를 조사하려고 한다. 이때, 문제를 간단하게 하기 위하여, 장마철에 내리는 비의 양에 따라 일정한 높이 이하의 모든 지점은 물에 잠긴다고 가정한다. 어떤 지역의 높이 정.. 2022. 7. 18.
728x90
반응형