본문 바로가기

전체 글131

[백준] 18353번 병사 배치하기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/18353 구상하기에 조금 헷갈렸던 다이나믹 프로그래밍 문제였다. [문제] N명의 병사가 무작위로 나열되어 있다. 각 병사는 특정한 값의 전투력을 보유하고 있으며, 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 한다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 한다. 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용한다. 그러면서도 남아있는 병사의 수가 최대가 되도록 하고 싶다. 예를 들어, N=7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하자. 이 때 3번 병사와 6번 병사를 열외시키면, .. 2023. 2. 23.
다이나믹 프로그래밍 - 금광 [문제] n x m 크기의 금광이 있다. 금광은 1 x 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작한다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있다. 이후에 m번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 한다. 결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력해라. 만약 다음과 같이 3 x 4 크기의 금광이 존재한다고 가정하자. [입력] 첫째 줄에 테스트 케이스 T가 입력된다.(1 2023. 2. 23.
닭갈비 재료 닭다리살 2 덩이, 양배추 1/4개, 양파 1개, 작은 감자 1개, 파 약간 양념 : 시중에 판매되는 닭갈비용 양념, 다진 마늘 1, 청양고추 1숟가락 레시피 1. 재료를 모두 미리 준비해둡니다. 닭다리살은 먹기 좋은 사이즈로 잘라서 양념에 버무려주고, 야채는 토막 내줍니다. 2. 팬에 야채를 바닥에, 고기를 위에 올리고 중~강불을 켜줍니다. 3. 지글지글해지면 저어주면서 야채에도 양념을 버무려줍니다. 4. 다 버무려졌고 야채에서 물도 살짝 나왔다면 중~약불로 낮추고 계속 저어줍니다. 닭이 익었다 싶으면 살짝 물어 진짜 익었나 체크해 봅니다. 국물도 살짝 간을 보고 약하다면 소스를 추가해 줍니다. 야채들이 숨이 죽고, 닭이 다 익었다면 불을 꺼줍니다. 4. 마무리로 통깨를 뿌려줍니다. 메모 굉장히 .. 2023. 2. 23.
다이나믹 프로그래밍 - 효율적인 화폐 구성 [문제] N가지 종류의 화폐가 있다. 이 화폐들의 개수를 최소한으로 이용해서 그 가치의 합이 M원이 되도록 하려고 한다. 이때 각 화폐는 몇 개라도 사용할 수 있으며, 사용한 화폐의 구성은 같지만 순서만 다른 것은 같은 경우로 구분한다. 예를 들어 2원, 3원 단위의 화폐가 있을 때는 15원을 만들기 위해 3원을 5개 사용하는 것이 가장 최소한의 화폐 개수이다. [입력] 첫째 줄에 N,M이 주어진다(1 2023. 2. 22.
다이나믹 프로그래밍 - 1로 만들기 [문제] 정수 X가 주어질 때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다. X가 5로 나누어떨어지면, 5로 나눈다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. X에서 1을 뺀다. 정수 X가 주어졌을때, 연산 4개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 예를 들어, 정수가 26이면 다음과 같이 계산해서 3번의 연산이 최솟값이다. 26 - 1 = 25 25 / 5 = 5 5 / 5 = 1 [입력] 첫째 줄에 정수 X이 주어진다. (1 2023. 2. 22.
다이나믹 프로그래밍 - 개미전사 [문제] 개미전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을에는 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있다. 각 식량창고에는 정해진 수의 식량을 저장하고 있ㄷ으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이때 메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다. 예를 들어 식량창고 4개가 다음과 같이 존재한다고 가정하자. {1, 3, 1, 5} 이때 개미 전사는 두 번째 식량창고와 네 번째 식량창고를 선택했을 때 최댓값.. 2023. 2. 21.
다이나믹 프로그래밍 이론 다이나믹 프로그래밍이란 일반적인 알고리즘 문제를 더 빠르게 해결하기 위해 생긴 기법이다. 다이나믹 프로그래밍은 다음 두 가지 조건을 만족할 때 사용 가능하다. 최적 부분 구조 큰 문제를 작은 문제로 나누고, 작은 문제들의 답을 모아 큰 문제를 해결할 수 있다. 중복되는 부분 문제 동일한 작은 문제들이 반복된다. 이렇게 얘기한다면 크게 와닿지 않는다. 재귀함수의 기본인 피보나치 수열을 예시로 들어보겠다. def fibo(n): if (n == 1 or n == 2): return 1 return (fibo(n - 1) + fibo(n - 2)) 피보나치 수열 함수는 다음과 같이 작성할 수 있다. 이 부분을 잘 모르겠다면 재귀함수를 공부해야한다. 위의 함수를 이용해 f(6)을 구하고자 한다면 그 함수는 f(.. 2023. 2. 21.
[백준] 12015번 가장 긴 증가하는 부분 수열 2 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/12015 도저히 구상할 수가 없어서 다른 코드를 참고하였다. 다른 코드를 보아도 왜 그런지 원리를 정확히 이해하는 것은 너무 어려웠다. 알고리즘을 적용시키는 스킬을 늘려주는 문제이다. [문제] 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. [입력] 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 .. 2023. 2. 17.
찜닭 닭다리살을 순살로 2키로를 구매했다. 닭다리살을 산 기념으로 찜닭에 도전해 보았다! 자취요리 박무땡님의 콜라찜닭 영상을 참고하였다. 재료 닭다리살 한덩이(200g?), 당근 1/3개, 양파 1/2개, 감자 1개 양념 : 콜라(닭이 2/3 잠길 만큼), 간장 3, 굴소스 2 레시피 1. 해동시킨 닭다리살을 살짝 삶는다. 불순물 및 잡내 제거 2. 살짝 겉이 익었다 싶으면 물을 다 버리고 닭을 자른다. 나는 크게 잘랐는데 먹기 좋게 한입 크기로 자르는 게 더 나을 듯 3. 콜라를 닭이 2/3 정도 잠길 만큼만 넣고 끓인다. 이때 간장과 굴소스를 넣는다. 콜라는 단맛과 색감용도이므로, 콜라가 없다면 설탕, 물엿, 올리고당 등으로 대체 가능 3. 6~7분 후에 야채를 넣으라고 했지만, 나는 순살로 하므로 4~5.. 2023. 2. 17.
[백준] 1300번 K번째 수 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1300 '의외로 이분 탐색으로 풀 수 있는 놀라운 문제 1'라고 설명되는 문제이다. 실제로 그랬다. 구상이 상당히 어려웠다. 처음 보았을 땐 이분탐색 알고리즘으로 푸는 방법이 전혀 생각나지 않았다. 구상이 어려워 다른 풀이를 조금 참고하여 풀었다. [문제] 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B의 인덱스는 1부터 시작한다. [입력] 첫째 줄에 배열의 크기 N이 주어진다. N은 10^5보다 작거나 같은 자.. 2023. 2. 16.
[백준] 2110번 공유기 설치 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/2110 이분 탐색 문제인 것을 알고 푸니까 쉽게 보였지만, 모르고 푼다면 구상하기에 꽤 어려울 것 같은 문제이다. [문제] 도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x_1, ..., x_N이고, 집 여러개가 같은 좌표를 가지는 일은 없다. 도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다. C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이.. 2023. 2. 15.
[백준] 1654번 랜선 자르기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1654 어렵지 않은 이분 탐색 문제였다. [문제] 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다. 이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.) 편의를 위해 랜선을 자르거나 만들 때 손실되.. 2023. 2. 15.
[백준] 10816번 숫자 찾기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/10816 이분 탐색을 이용한 문제이다. [문제] 숫자 카드는 정수 하나가 적혀 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오. [입력] 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이.. 2023. 2. 15.
[백준] 1920번 수 찾기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1920 쉬운 이분 탐색 문제였다. [문제] 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)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31보다 작다. [출력] M개의 줄에 답을 출력한다. 존재하면 1을, 존재하.. 2023. 2. 14.
이진 탐색 - 정렬된 배열에서 특정 수의 개수 구하기 [문제] N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요. 예를 들어 수열 {1,1,2,2,2,2,3}이 있을 때 x = 2라면, 현재 수열에서 값이 2인 원소가 4개이므로 4를 출력합니다. 단, 이 문제는 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다. [입력] 첫째 줄에 N과 x가 정수 형태로 공백으로 구분되어 입력됩니다. (1 2023. 2. 14.
이진 탐색 - 떡볶이 떡 만들기 이 문제는 백준 나무 자르기 문제와 동일한 문제로 아래 링크에서 채점이 가능합니다. https://www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net [문제] 오늘 동빈이는 여행 가신 부모님을 대신해서 떡집 일을 하기로 했다. 오늘은 떡볶이 떡을 만드는 날이다. 동빈이네 떡볶이 떡은 재밌게도 떡볶이 떡의 길이가 일정하지 않다. 대신에 한 봉지 안에 들어가는 떡의 총 길이는 절단기로 잘라서 맞춰준다... 2023. 2. 14.
이진 탐색 이론 bisect이진 탐색이란, 기존의 하나하나 검사하는 탐색 방법보다 더 빠른 탐색 알고리즘이다. 원래대로라면 길이가 N인 배열에서 어떠한 원소를 찾고자 한다면, 처음부터 N개의 원소를 하나하나 검사해보는 방식으로 탐색을 한다. 따라서 기존의 탐색 시간복잡도는 O(N)이다. 하지만 배열이 정렬되어 있다는 가정 하에 이진 탐색은 더 빠른 시간복잡도를 보장한다. 이진탐색이란? 이진탐색이란 정렬되어있는 배열에서 특정 값을 찾는 방법이다. 찾고자 하는 값을 target이라고 할 때, 배열의 중간 위치의 값이 target보다 작은지 큰지를 검사한다. 배열을 반으로 나눈 후 중간 위치의 값이 target보다 작다면 뒤의 배열에서 같은 방식으로 탐색을 반복하고, 크다면 앞의 배열에서 같은 방식으로 탐색을 반복한다. 길이.. 2023. 2. 13.
정렬 이론 이것이 코딩테스트다에 있는 정렬은 다음과 같다. 선택정렬 삽입정렬 퀵정렬 계수정렬 1. 선택정렬 선택정렬은 가장 작은 값을 선택해 앞으로 보내는 과정을 반복하여 배열을 정렬해준다. 예를 들어 [3, 2, 5, 1, 4]라는 배열이 있다면, 이 배열에서 가장 작은 값인 1을 맨 앞의 3이랑 위치를 바꿔준다. [1, 2, 5, 3, 4]에서는 이미 정렬된 1을 제외한 [2, 5, 3, 4] 중 가장 작은 데이터인 2를 맨 앞으로 보낸다. (2가 이미 맨 앞의 숫자라 달라진 점은 없다.) 그 다음엔 [1, 2, 5, 3, 4]에서 이미 정렬된 1, 2를 제외한 [5, 3, 4] 중 가장 작은 데이터인 3을 맨 앞의 5랑 바꾼다. [1, 2, 3, 5, 4]에서 같은 방식으로 남은 5, 4의 위치를 바꿔주면 완.. 2023. 2. 13.
감자조림 오늘은 하이퍼마켓에 갔다가 감자를 너무 싸게 팔길래 바로 업어왔다. 그치만 너무 많이 사버려서 오늘 당장 뭔가 해먹어야겠다 생각했다. 처음엔 감자전을 해보려다가 감자를 갈 수가 없어서 포기... 검색 좀 하다가 감자조림으로 땅땅땅~ 사실 원래는 딱히 업로드할 생각이 없었는데 먹어보니까 너무 맛있어서 업로드 하는 것이다! 그래서 중간과정 사진이 없음 ㅜㅅㅜ (순서랑 재료만 좀 끄적이겠음) 재료 감자 2개, 당근 1/3개 양념 : 물 150ml, 진간장 5, 올리고당 3, 설탕 1, 미원 0.3?, 백종원표 매운소스 약간 레시피 재료 준비 감자, 당근 토막썰기 - 당근은 감자보다 더 작게 썰고, 감자는 찬물에 담궈두기 양념 재료 모두 섞어놓기 1. 팬에 식용유 두르고 강불에 감자만 투하 냄비에다가 하면 큰일.. 2023. 2. 10.
[백준] 1707번 이분 그래프 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1707 이분 그래프의 개념만 익힌다면 수월하게 구상, 구현할 수 있다. [문제] 그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph)라 부른다. 그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오. [입력] 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을빈칸을 사이에 두고 순서대로 .. 2023. 2. 1.