알고리즘/BOJ 1235

백준 15753번 Taming the Herd

문제 링크입니다: https://www.acmicpc.net/problem/15753 문제에서 요구하는 바를 이해하는데 매우 오래 걸린 문제였습니다. 알고리즘은 아래와 같습니다.1. 해당 카운터에 모순이 없는지를 확인합니다.i) i번째에 적혀 있는 일 수가 (현재 - 마지막 탈출)보다 크거나ii) (현재 - 적혀 있는 일)에는 탈출한 적이 없는 것이 확실하면 모순입니다.2. 모순이 없다면 반복문을 돌면서 마지막 탈출 일 수를 표시하고 확실하게 탈출하지 않은 날들을 표시합니다.3. 탈출한 날들의 합의 최소는 확실하게 탈출한 날만 셀 경우입니다.4. 탈출한 날들의 합의 최대는 전체 일 수에서 확실하게 탈출하지 않은 날들을 제외한 경우입니다. #include #include using namespace std..

알고리즘/BOJ 2018.09.15

백준 15752번 Hoofball

문제 링크입니다: https://www.acmicpc.net/problem/15752 같은 학교 학우들이신 Green55님과 degurii님은 DFS를 이용하여 푼 문제였지만 저는 다음 소를 지정하는 함수만을 이용하여 풀었던 문제였습니다. 알고리즘은 아래와 같습니다.1. 소들의 좌표를 오름차순으로 정렬합니다.2. 모든 소들을 선택하여 다음 소에게 공을 전달하도록 하고 공을 전달 받은 소들을 표시합니다.3. 다시 모든 소들을 순회하는데 한번도 공을 전달 받지 않은 소들은 꼭 공을 사람으로부터 받아야합니다.-> 또한 서로에게만 공을 주는 소들에 대한 쌍들 또한 공을 사람으로부터 받아야합니다.4. 3번에서 계산한 공들의 합을 출력해줍니다. #include #include using namespace std; ..

알고리즘/BOJ 2018.09.15

백준 15751번 Teleportation

문제 링크입니다: https://www.acmicpc.net/problem/15751 이 문제는 사실 단순 계산을 통해 아래와 같은 세 가지 중 최소를 출력해주면 되는 문제였습니다.1. A ~ B까지 뚜벅뚜벅2. A -> X -> Y -> B3. A -> Y -> X -> B 저도 위 세 가지 경로를 고려했지만 바보 같이 BFS(Breadth First Search)를 사용하여 코드 길이만 엄청 길어졌네요.#include #include using namespace std; bool visited[100 + 1]; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int a, b, x, y; cin >> a >> b >> x >> y; queue q..

알고리즘/BOJ 2018.09.15

백준 10696번 Prof. Ossama

문제 링크입니다: https://www.acmicpc.net/problem/10696 초기에는 Big Integer를 이용해 계산하는 방법을 떠올렸지만 구현하기가 힘들 것 같아서 다른 방법을 생각해봤습니다. 알고리즘은 생각보다 간단합니다.1. 제일 큰 자릿수부터 X에 대한 나머지(remainder)를 구합니다.2. 이후에는 (remainder * 10 + 현재 자릿수)의 X에 대한 나머지를 remainder에 저장해줍니다. (한 자리씩 더 파악)3. 모든 자릿수에 대해 2번을 반복한 뒤 remainder를 출력해주면 됩니다. #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int..

알고리즘/BOJ 2018.09.15

백준 3040번 백설 공주와 일곱 난쟁이

문제 링크입니다: https://www.acmicpc.net/problem/3040 알고리즘은 아래와 같습니다.1. 숫자를 입력받을 때 모든 숫자의 합을 구합니다.2. 이중 반복문을 돌려서 두 명의 난쟁이를 뺐을 때 합계가 100이면 해당 난쟁이들의 숫자를 제외한 숫자들을 출력해줍니다. #include #include using namespace std; int main(void) { int sum = 0; vector v(9); for (int i = 0; i > v[i]; sum += v[i]; } for (int i = 0; i < 8; i++) { bool answer = false; for (int j = i + 1; j < 9; j++) { if (sum - (v..

알고리즘/BOJ 2018.09.14

백준 2822번 점수 계산

문제 링크입니다: https://www.acmicpc.net/problem/2822 vector, algorithm, functional 헤더를 처음 접하는 사람들이 연습 삼아 풀기 좋은 문제인 것 같습니다! #include #include #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); vector v(8); //{score, idx} for (int i = 0; i > v[i].first; v[i].second = i + 1; } //내림차순 정렬 sort(v.begin(), v.end(), greater()); int sum = 0; vecto..

알고리즘/BOJ 2018.09.14

백준 11774번 MOLEKULE

문제 링크입니다: https://www.acmicpc.net/problem/11774 정점들이 양방향으로 이어진 트리가 주어졌을 때, 최장경로가 제일 작아지도록 단방향 그래프로 변형시키는 문제였습니다.우선, 이 문제는 같은 학교 학우이신 Green55(구 ssangba55)님의 설명을 듣고 풀 수 있었던 문제였습니다.Green55님의 해설(https://blog.naver.com/pasdfq/221358553139)입니다. 제 코드는 COCI 2015/2016 Archive에 있는 코드를 참고하여 작성했습니다.(아직 많이 부족하네요 ㅠ) 알고리즘은 아래와 같습니다.1. 우선, 주어진 간선을 토대로 양방향 그래프로 입력받습니다.2. 해당 정점을 시작으로 하는 단방향 간선이 있는지 여부를 connected ..

알고리즘/BOJ 2018.09.14

백준 11773번 ESEJ

문제 링크입니다: https://www.acmicpc.net/problem/11773 간단한 문자열 처리 문제였습니다. #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int A, B; cin >> A >> B; //안전하게 (A+B)/2개의 단어를 출력했습니다 //모두 다른 단어를 출력하므로 마지막 조건은 신경 쓸 필요가 없습니다 //그리고 26^5만 되도 100,000을 넘기 때문에 두 번째 조건도 신경 쓸 필요가 없습니다 for (int i = 0; i < (A + B) / 2; i++) { int temp = i; string s; while (1) { s += char(..

알고리즘/BOJ 2018.09.14

백준 3988번 수 고르기

문제 링크입니다: https://www.acmicpc.net/problem/3988 슬라이딩 윈도우 기법을 이용하여 푸는 문제였습니다.백준 2905번 홍준이와 울타리(http://jaimemin.tistory.com/832)처럼 monotone queue를 이용하여 푸는 문제였습니다. #include #include #include using namespace std; const int MAX = 1000000; const int INF = 987654321; int arr[MAX]; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int N, K; cin >> N >> K; for (int i = 0; i > arr[i..

알고리즘/BOJ 2018.09.12