알고리즘/BOJ 1235

백준 11721번 열 개씩 끊어 출력하기

문제 링크입니다: https://www.acmicpc.net/problem/11721 string의 substr만 잘 이용한다면 쉽게 풀 수 있는 문제였습니다. 알고리즘은 아래와 같습니다.1. 몇개의 줄에 걸쳐 출력해야하는지 구합니다.2. 마지막 줄을 제외하고는 전부 10개의 문자를 출력해야하기 때문에 반복문을 통해 출력해줍니다.3. 마지막 줄은 남은 문자만큼 출력해줍니다. #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); //cin 실행속도 향상 string s; cin >> s; //반복할 횟수 구함 int cnt = s.length() / 10; if (s.length() %..

알고리즘/BOJ 2018.08.28

백준 10818번 최소, 최대

문제 링크입니다: https://www.acmicpc.net/problem/10818 최대 1,000,000, 최소 -1,000,000이기 때문에 최대값의 초기값을 -1,000,000로 잡고 최소값의 초기값을 1,000,000로 잡으면 쉽게 풀 수 있는 문제였습니다. #include #include using namespace std; const int MAX = 1000000; int N; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); //cin 실행속도 향상 cin >> N; int maxNum = -MAX, minNum = MAX; for (int i = 0; i > temp; maxNum =..

알고리즘/BOJ 2018.08.28

백준 5919번 Hay Bales

문제 링크입니다: https://www.acmicpc.net/problem/5919 간단하게 해석하자면 모든 건초더미들의 높이가 같게 하려면 건초더미들을 몇번 움직여야하는지 구하는 문제였습니다. 알고리즘은 아래와 같습니다.1. 우선 건초더미들의 개수 평균을 구합니다.2. 결국 평균보다 높이 쌓여있는 건초더미들에서 낮은 건초더미들로 옮겨야하므로 평균보다 얼마나 높은지의 누적합을 구하면 됩니다. #include using namespace std; const int MAX = 10000; int N; int hay[MAX]; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); //cin 실행속도 향상 cin >> N; int sum = 0; for (in..

알고리즘/BOJ 2018.08.28

백준 1922번 네트워크 연결

문제 링크입니다: https://www.acmicpc.net/problem/1922 MST(Minimum Spanning Tree) 문제였습니다.우선순위 큐를 이용하면 쉽게 풀 수 있는 간단한 문제였습니다. 알고리즘은 아래와 같습니다.1. minHeap을 구성하는 우선순위 큐를 선언합니다.2. 1번 정점부터 최소 스패닝 트리를 구성하기 시작합니다.3. 최소힙의 루트에 있는 정점을 확인합니다.i) 이미 방문한 정점이라면 최소 가중치가 아니기 때문에 패스ii) 방문하지 않은 정점이라면 가중치를 결과에 더해주고 해당 정점과 연결된 정점들 중 방문하지 않은 정점들을 우선순위 큐에 넣습니다.4. 3번을 반복하면서 얻은 가중치의 합들을 출력합니다 #include #include #include #include us..

알고리즘/BOJ 2018.08.28

백준 10740번 ACM

문제 링크입니다: https://www.acmicpc.net/problem/10740 알고리즘 대회에서 각각의 단계에 속한 문제들 중 제일 쉬운 문제를 푸는 전략을 고수할 때 최소 점수를 출력하라는 문제였습니다.위와 같은 조건만 주어졌을 경우 엄청 쉬운 문제이지만, 모든 열을 적어도 한번 이상은 사용해야한다고 명시되어있기 때문에 DP를 이용하여 풀어야하는 문제였습니다. 알고리즘은 아래와 같습니다.1. 각각의 문제 난이도를 입력 받을 때 부분합도 같이 계산해줍니다.2. 첫 번째 단계 문제에서 0 번째 열, 1 번째 열, 2 번째 열에서 시작하는 경우로 나뉘기 때문에 세 가지 경우를 모두 고려해줘야합니다.3. 아래와 같이 두 가지의 경우를 고려해줘야합니다.i) 해당 단계에서 푼 문제의 열과 이전 단계에서 푼..

알고리즘/BOJ 2018.08.21

백준 10739번 KRIZA

문제 링크입니다: https://www.acmicpc.net/problem/10739 사이클과 모듈라 연산을 적절히 이용해서 풀어야하는 문제였습니다.종이에 그려보면서 수학적으로 접근한다면 그렇게 어려운 문제는 아니지만 고려해야할 사항이 많기 때문에 2시간 내에 COCI A~D번 문제를 풀 때는 AC를 받지 못했던 문제였습니다.코드의 설명은 같은 학교 학우이신 ssangba55님(https://blog.naver.com/pasdfq/221342517310)이 정말 잘 설명해주셨기 때문에 링크를 타고 가서 설명을 읽어보시는 것을 추천드립니다! #include using namespace std; const int MAX = 100000 + 1; long long N, K, result; long long p..

알고리즘/BOJ 2018.08.21

백준 10738번 TETA

문제 링크입니다: https://www.acmicpc.net/problem/10738 세트에 포함된 어떠한 메뉴의 단품 가격보다 세트의 가격이 싸거나 같기 때문에 세트를 시킬 수 있는만큼 세트를 시킨 다음 나머지 메뉴를 시키도록 그리디(Greedy)하게 접근해야 하는 문제였습니다. #include #include using namespace std; const int MAX = 20 + 1; int price[MAX]; int meals[4]; int kindOfMeals[MAX]; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int K; cin >> K; for (int i = 1; i > price[i]; int X; cin >> X; fo..

알고리즘/BOJ 2018.08.21

백준 15956번 숏코딩

문제 링크입니다: https://www.acmicpc.net/problem/15956 동치(Equivalent)라는 개념과 Union Find를 알아야 풀 수 있는 문제였습니다.백준 15955번 부스터와 마찬가지로 카카오 코딩 페스티벌 예선 문제였고 대회 당시에는 풀지 못했던 문제였습니다. 우선 알고리즘은 아래와 같습니다.1. 입력 받은 조건문을 파싱하는데 ==과 !=을 구분하여 파싱합니다.2. ==인 요소끼리 merge 함수를 이용하여 한 그룹에 합칩니다.3. 각각의 그룹끼리 나눕니다.4. 각 그룹을 순회하면서 답을 구성하는데 모순이 발생하는 경우 바로 거짓이면서 제일 짧은 조건문(길이: 4)을 출력하고 프로그램을 끝냅니다.-> 모순이 아니라면 그룹 내 제일 짧은 요소를 찾고 해당 요소가 답에 꼭 포함..

알고리즘/BOJ 2018.08.19

백준 15955번 부스터

문제 링크입니다: https://www.acmicpc.net/problem/15955 카카오 코드 페스티벌 2018 예선 D번 문제였습니다.대회 당시에는 풀지 못했지만 같은 학교 학우이신 ssangba55님(https://blog.naver.com/pasdfq/221332735719)과 대회 공식 해설(http://tech.kakao.com/2018/08/09/code-festival-2018-round-1/)을 통해 풀 수 있었습니다.이 문제에서 핵심은 Union Find 혹은 Disjoint-Set이였습니다. 알고리즘은 아래와 같습니다.1. 문제에서 주어진 힌트와 다르게 처음부터 부스터를 쓴 다음에 수직으로 다음 체크 포인트로 가는 것이 최적입니다.-> 따라서 min(abs(Xu-Xv), abs(Yu..

알고리즘/BOJ 2018.08.19

백준 14211번 Kas

문제 링크입니다: https://www.acmicpc.net/problem/14211 백준 1126번 같은 탑(http://jaimemin.tistory.com/717)과 동일한 문제였습니다.(인덱스)와 (두 사람의 수표 보유량 차)를 기준으로 하는 DP 문제로 접근하면 쉽게 풀 수 있는 문제였습니다.어차피 두 사람이 나누지 못하는 수표는 룰렛을 통해 두배로 만든 다음에 반씩 나누어가지기 때문에 (동일하게 나눈 수표 가치의 합) + (남은 수표)를 출력해줘야 정답입니다! #include #include #include using namespace std; const int MAX = 500 + 1; const int INF = 987654321; int N, sum; int money[MAX]; int ..

알고리즘/BOJ 2018.08.19