본문 바로가기

알고리즘

(74)
백준 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이 모두 숫자의 합을 표현할 ..
백준 11725 트리의 부모찾기-C++ 모든 트리문제를 트리구조로 만들어서 풀 필요는 없다. 코드의 2~4줄의 주석처럼 코딩을 했더라면 아마 100줄이상은 분량이 나왔을거다. 문제의 핵심은 각 연결된 두 정점이 있을 때, 둘 중 무엇이 start node고 무엇이 end node인지 모른다는 것이다. 모를 때는 pair로 접근하는 것은 어려운것 같고, 양방향으로 탐색을 해야하기 때문에 벡터에다가 node1 - node2 , node2 - node1 두 가지 모두를 집어넣으면 된다는 점이다. 이렇게 벡터로 트리를 구현한 다음, dfs로 방문 여부를 판단하면서 부모 노드를 기록하면서 진행하면 된다. 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..
백준 1991 트리순회 - 이진트리와 재귀함수 (C++) 작년에 배운 자료구조도 오랜만에 복습할겸, 사실 지금 백준은 c++를 공부중이며 짜는 중이라 클래스 개념도 잡을겸 AC받은 코드를 보면서 카피해서 코딩했다. 전위 순회, 중위 순회 및 후위 순회의 출력 방식은 위에 자세히 설명되어 있고, 왼쪽 오른쪽을 탐색할때, 재귀함수가 필요한 부분은 그때마다 호출해서 출력해주면 된다. 나는 자료구조를 자바로 공부해서.. C++ 코드는 얼마나 다를까 봤는데 사실 문법빼곤 다 똑같아서 습득하는데는 얼마 걸리진 않았다. 나름 처음보고 신기했던(?) 문법은 1. public method를 public: 밑의 인덴트로 설정하는것 2. 클래스 메소드를 부를때는 클래스::메소드(파라미터) 형식 정도.. 복습하면서 풀기 괜찮았던 문제. 1 2 3 4 5 6 7 8 9 10 11 1..