알고리즘/BOJ 1235

백준 2823번 유턴 싫어

문제 링크입니다: https://www.acmicpc.net/problem/2823 처음에는 BFS 알고리즘으로 접근했다가 틀렸던 문제였습니다. 알고리즘은 아래와 같습니다.1. 마을을 전부 탐색하는데 빌딩이면 지나가고, 길일 경우에만 상하좌우로 탐색합니다.2. 길을 기준으로 상하좌우에 길이 없거나 길이 한군데에만 뚫려있을 경우 반드시 유턴을 해야합니다.-> 따라서, 이런 케이스가 발생하면 사이클이 있다고 표시하고 반복문을 탈출합니다.3. 사이클이 있을 경우 0, 없는 경우 1을 출력해줍니다. #include #include #include using namespace std; typedef struct { int y, x; }Dir; Dir moveDir[4] = { {1, 0}, {-1, 0}, {0,..

알고리즘/BOJ 2018.09.18

백준 2847번 게임을 만드는 동준이

문제 링크입니다: https://www.acmicpc.net/problem/2847 배열에 점수를 입력받고 끝 스테이지부터 첫 번째 스테이지까지 순회하면서 내림차순인지 확인하면 되는 문제였습니다. #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int N; cin >> N; vector v(N); for (int i = 0; i > v[i]; int cur = v[N - 1]; int result = 0; for (int i = N - 2; i >= 0; i--) { while (v[i] >= cur) { v[i]--; result++; } cur = ..

알고리즘/BOJ 2018.09.18

백준 2798번 블랙잭

문제 링크입니다: https://www.acmicpc.net/problem/2798 재귀를 이용하여 완전탐색을 해주면 되는 문제였습니다.기저 사례만 잘 작성해준다면 크게 어려운 점은 없는 것 같습니다. #include #include #include using namespace std; int N, M; int result; vector v; void sumOfCards(int idx, int cnt, int sum) { //조건 만족할 경우 if (cnt == 3 && sum = N || cnt > 3 || sum > M) return; //해당 카드 선택 sumOfCards(idx + 1, cnt + 1, sum + v[idx]); //해당 카드 선택 X sumOfCards(idx + 1, cnt, ..

알고리즘/BOJ 2018.09.18

백준 1159번 농구 경기

문제 링크입니다: https://www.acmicpc.net/problem/1159 vector와 string을 연습하기 좋은 문제였습니다. #include #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); int N; cin >> N; vector v(26, vector(0)); for (int i = 0; i > name; //해당 알파벳으로 시작하는 선수 추가 v[int(name[0] - 97)].push_back('a'); } string result; //해당 알파벳으로 시작하는 선수들 5명 이상인 경우 for (int..

알고리즘/BOJ 2018.09.18

백준 11775번 SLON

문제 링크입니다: https://www.acmicpc.net/problem/11775 COCI 2015/2016 D번 문제였습니다.같은 학교 학우님들과 시간을 정해두고 풀 때는 후위연산식을 이용하여 푸는 문제인 것을 알았지만 구현이 상당히 어려워 결국 풀지 못했던 문제였습니다.Green55님도 결국 쉬운길을 택하셔서 python 3으로 푸셨고 다른 사람들은 어떻게 풀었는지 확인하기 위해 저도 파이썬 코드를 제출해봤습니다.COCI 문제들 대부분이 번역이 되어있지 않기 때문에 푼 사람이 별로 없었는데 portableangel님의 코드가 예술이였습니다. portableangel님의 코드에서 제가 좀 더 이해하기 쉽게 변수명을 바꿔봤습니다.문제가 된다면 바로 삭제하겠습니다! 알고리즘은 아래와 같습니다.1. 일차..

알고리즘/BOJ 2018.09.18

백준 2879번 코딩은 예쁘게

문제 링크입니다: https://www.acmicpc.net/problem/2879 분류는 스택과 다이나믹 프로그래밍이라고 되어있지만 단순 수학 문제로 접근했던 문제였습니다. 알고리즘은 아래와 같습니다.1. 현재 줄에 있는 탭의 개수와 원하는 탭의 개수의 차이를 diff 배열에 저장합니다.2. 처음부터 끝까지 반복문을 통해 접근합니다.i) 부호가 달라질 경우 더 이상 같은 그룹으로 못 묶으므로 무조건 이전의 차이(즉, diff[i-1])를 결과 값에 더해줍니다.ii) 이전의 차이와 부호가 같고 양수일 떄는 증가수열(음수일 때는 감소수열)을 유지할 경우 같은 그룹으로 묶읍니다.iii) 부호가 같더라도 증가수열(혹은 감소수열)을 유지 못하는 경우 또한 같은 그룹으로 묶지 못합니다.-> 기존의 diff와 현재..

알고리즘/BOJ 2018.09.18

백준 4604번 Steganography

문제 링크입니다: https://www.acmicpc.net/problem/4604 문자열 파싱과 덱을 이용하여 풀어야하는 문제였습니다. 알고리즘은 아래와 같습니다.1. 공백 포함 문자열을 입력받아야하므로 getline을 이용하여 문자열을 입력받습니다.2. 공백이 오면 연속 몇개가 오는지 확인합니다.i) 홀수 개면 덱에 0을 push_back 하고ii) 짝수 개면 덱에 1을 push_back 합니다.3. *이 입력되면 메시지가 끝난 것이므로 결과를 출력하기 시작합니다.i) 덱의 사이즈가 5의 배수가 되도록 0을 push_back합니다.ii) 5개씩 pop_front하여 이진수를 십진수로 바꾸고 결과에 따라 문자를 출력합니다.iii) 마지막에 개행을 해줍니다.4. #이 입력되면 프로그램을 끝냅니다. #in..

알고리즘/BOJ 2018.09.16

백준 4673번 셀프 넘버

문제 링크입니다: https://www.acmicpc.net/problem/4673 간단한 문제였습니다. 알고리즘은 아래와 같습니다.1. 1 ~ 10,000까지 D 함수의 매개변수로 전달하여 결과가 10,000 이하인 숫자들에 대해 방문 처리를 해줍니다.2. 1 ~ 10000 사이에 방문 처리되지 않은 숫자들을 출력해줍니다. #include using namespace std; const int MAX = 10000 + 1; bool visited[MAX]; int D(int N) { int result = N; //반복문을 이용하여 N의 자릿수로 케이스를 나눌 필요가 없다 while (N) { result += N % 10; N /= 10; } return result; } int main(void) ..

알고리즘/BOJ 2018.09.16

백준 10552번 DOM

문제 링크입니다: https://www.acmicpc.net/problem/10552 추상적 그래프를 이용하여 풀어야했던 문제였습니다.(명시적으로 그래프가 주어지지 않았으므로 어떻게 그래프로 구현할까를 고민해보고 접근해야하는 문제였습니다.) 알고리즘은 아래와 같습니다.1. 싫어하는 채널을 인덱스로 두고 최고로 좋아하는 채널을 벡터에 추가해줍니다.2. 큐에 현재 채널을 입력하고 현재 채널을 상영했다고 표시해줍니다.3. 이후에는 BFS(Breadth First Search) 알고리즘처럼 접근하는데 최연소자만 움직여 채널을 바꿉니다.i) 이미 해당 최연소자가 채널을 바꿨다면 사이클이 생성되었다는 것이므로 -1을 출력합니다.ii) 해당 최연소자가 움직이지 않았다면 큐에 해당 최연소자가 좋아하는 채널을 넣고 바꾼..

알고리즘/BOJ 2018.09.16

백준 10551번 STROJOPIS

문제 링크입니다: https://www.acmicpc.net/problem/10551 switch문을 적절히 사용하면 쉽게 맞출 수 있는 문제였습니다. #include #include using namespace std; int fingers[8]; int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); string s; cin >> s; for (int i = 0; i < s.length(); i++) { switch (s[i]) { case '1': case 'Q': case 'A': case 'Z': fingers[0]++; break; case '2': case 'W': case 'S': case 'X': fingers[1]++; break; ca..

알고리즘/BOJ 2018.09.16