본문 바로가기

알고리즘/백준

(68)
백준 1780 종이의 개수 - 분할정복 - C++ https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다. 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다. (1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다. 이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으 www.acmicpc.net 전형적인 분할정복 알고리즘이다. n*n짜리 배열에서 같은 숫자가 나오면 패스고, 다른 숫자가 검출이 되면 n/3*n/3짜리 배열 9개..
백준 2110 공유기 설치 - 이분탐색 C++ https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (1 ≤ xi ≤ 1,000,000,000)가 한 줄에 하나씩 주어진다. www.acmicpc.net main 함수의 이분탐색 방식은 똑같고, 어떤 interval을 두고 공유기를 설치할수 있냐 없냐를 판단 하는 여부가 조금 까다로운 부분이지 않았나 싶었다. 13번째 줄에 current_x를 current_x+interval로 두지 않고 x[i]로 두어야 하는 부분을 조심하자. 어떤 인터벌을 두고 공유기를 n개 이상 설..
백준 2805 나무자르기 - 이분탐색 C++ (미완) https://www.acmicpc.net/problem/2805 불러오는 중입니다... 이 문제도 이분탐색을 물어보는 문제였다. 랜선자르기 문제(1654번)과 거의 동일한 구조이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include using namespace std; int N; long long meter_of_tree; long long tree[1000001]; bool ispossible(int height){ long long count=0; for(int i=0; iheight) count+=tr..
백준 1654 랜선자르기(이분탐색)-C++ https://www.acmicpc.net/problem/1654 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다. www.acmicpc.net 오늘부터 이분탐색 문제를 풀기 시작했다. 이분탐색 알고리즘은 간단하다. 찾고자 하는 값을 정렬시킨다음에(여기서는 자르려는 길이이므로 정렬할 필요가 없음) 제일 큰값 제일 작은값의 중간을 탐색. 그것보다 크냐 작냐를 가지고 최댓값 또..
백준 9663 N-Queen (백트래킹(가지치기), 재귀함수) - C++ https://www.acmicpc.net/problem/9663 재귀함수 문제이다. 맨 처음에 자료구조였나,, 이문제를 들었던 적이 있는데 그때는 나한테 너무나도 어렵게 느껴졌었는데 지금은 어떻게 풀어야하는 아이디어가 대략 있으니까 어렵지 않게 구현한 것 같다. col[i] 는 우선 i번째 열의 행 값이다.(위에서부터 몇번째 행에 있는지) 1열부터 해서 값을 설정한 다음에, 그 다음열부터 이전 열들에 위치한 행값을 비교하면서 N번째까지 갔을 경우 1증가, 아닐시 false를 반환하고 끝내면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include using namespace s..
백준 9012 괄호 (문자열)- C++ https://www.acmicpc.net/problem/9012 딱히 특별한것 없는 문자열 알고리즘이다. 괄호 개수를 세면서 (일땐 1을 더하고, )일땐 1을 빼면서, 마지막에 총 개수가 0이면 yes 아닐시 no를 출력하면 된다. 맨처음엔 큐로 구현을 하려고 했으나 굳이 그럴 필요 없이 숫자같은 변수를 활용해서 풀면 간단하게 풀 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #include #include using namespace std; int main(void){ queue q; int casenum; cin>>casenum; for(int i=0; i>s; ..
백준 1931 회의실 배정-greedy algorithm(C++) https://www.acmicpc.net/problem/1931 1931번: 회의실배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 그리디 알고리즘의 전형적인 예시이다. 학교 알고리즘 시간에 거의 똑같은 문제를 다뤄봐서 쉽게 풀줄 알았는데, 막상 어려웠던 부분은 구현단계였다. 우선 문제를 풀기 위해서는 끝나는 시간에 주목해야한다. 1.끝나는 시간이 가장 빠른 녀석을 골라서, 2.그 끝나는 시간보다 시작시간이 빠른 녀석들을 골라 3.그 녀석들을 전부 지우고, 1~3의 과정을 반복하는 식이다. 시작시간과 끝시간을 배열로 넣어서 그걸 다시 벡터로 저장한 다음에, 벡터를 끝 시간을 기준으로 오름차순으로 정렬해야한다. (pair를 가진 벡터는, 정렬하고..
백준 10610 30 (greedy) - C++ https://www.acmicpc.net/problem/10610 10610번: 30 문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다. 미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라. 입력 N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다. 출력 미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는 www.acmicpc.net 출력초과가 난 이유는 sum을 int로 설정해서였다. 입력되는 숫자 자리수가 일단 굉장히 크기 때문에 sum이 모두 숫자의 합을 표현할 ..