본문 바로가기

반응형

알고리즘/BOJ

1527번 1527번 - 금민수의 개수 재귀함수를 통해서 A보다 크고 B보다 작은 수를 만들어내면서 정답을 체크해갔다. 만든 숫자 끝에 4 나 7을 추가하면서 , 위의 조건을 만들면 정답 개수를 하나씩 늘렸다. depth >= 10 을 체크한 것은, 혹시 10억의 자릿수가 10개 이기 때문에, 그 수를 넘어가는 경우를 체크했다. 123456789101112131415161718192021222324252627282930313233343536373839#includeusing namespace std;int ans = 0;void dfs(int lower,int upper,int depth,int num){ if (depth >= 10) { return ; } if (num > upper) { return ; } i.. 더보기
9625번 9625번 - BABBA 처음에는 string 객체를 만들어서, 돌아갈 때마다 문자열을 새로 만들고, 마지막에 다시 갯수를 세서 문제를 풀었다. 그랬더니 메모리 초과가 발생했다.. 다시 생각해보니, 단순히 갯수만으로도 충분히 풀 수 있는 문제였는데 엄청 큰 문자열을 쓰는 우를 범했다. 단순하게 A 1개는 자신을 희생하고 B 1개를 생산하고, B는 A 1개, B는 그대로를 유지하므로 그에 관해서 풀면 된다. 12345678910111213141516171819202122#include using namespace std; int main(){ int k; cin >> k; int numA = 1, numB = 0; for (int i = 0; i 더보기
8320번 8320번 - 직사각형을 만드는 방법 직사각형을 만드는 방법은 약수들을 이용하면 된다. 단, 중복되는 약수들은 피해야 한다. 문제에서의 조건처럼. for문을 통해 i*i n; for (int i = 1; i 더보기
7453번 7453번 - 합이 0인 네 정수 이 문제는 재귀함수를 통해서 풀면, 100퍼센트 시간초과에 걸린다. 4000^4이기 때문에 .. 어떻게 풀지 몰라서 다른 사람들의 풀이를 참고해서 풀었다. 배열을 합친 후에 이분탐색을 통해서 문제를 해결했다. 이분탐색 공부를 다시 시작해봐야 할 것 같다. 이번에 새로 알게 된 점 - upper_bound 와 lower_bound . 이거 이용하면 되게 편하게 쓸 것 같다. - binary_search 라는 이분탐색 함수가 있다는 것도 처음 알았다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include#include#include#includ.. 더보기
1062번 1062번 - 가르침 처음에는 각 단어마다 필요한 단어를 구하고, 몇개고 이렇게 구하려다가.. 너무 답이 안보여서 아예 미리 단어를 모두 뽑고, 거기에 맞춰서 읽을 수 있는지 없는지를 판단하는 문제로 풀었다. 근데 처음에 시간초과가 계속 발생해서, 시간초과를 줄이려고 노력했다. 그래서 디버깅을 하다 보니, for문을 통해서 할 때의 그 같은 숫자의 반복이 생겼다. 마치 14889번 문제를 풀 때, 하나의 팀으로만 하려니까 중복되는 값이 계속 반복되던 것처럼 그래서 q를 추가해서, 중복되지 않도록 했더니, AC를 받을 수 있었다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354.. 더보기
2858번 2858번 - 기숙사 바닥 처음에 문제를 너무 얕잡아 봤다.. 쉬운데? 하면서 풀었는데 틀렸다. if ((x - 2)*(y - 2) == B) { break; } 처음에 이 부분을 체크하지 않고 바로 답을 구해주는 방식으로 풀어서 틀렸다. 정답이 유일무이하다는 문제의 지문을 보고, 아 구하기만 하면 무조건 답이 나오는구나 하고 생각했는데 큰 오산이었다. x,y 를 만족하는 많은 약수들 중에, 다시 가장자리 숫자나, 갈색 타일의 숫자가 다를 수도 있다는 사실을 착각했다. 문제를 제대로 읽어야 겠다. 자만 금물 1234567891011121314151617181920212223242526272829#include using namespace std; int main(){ int R, B, sum; cin >.. 더보기
1251번 1251번 - 단어 나누기 전체 문자열을 3등분 하기 위해서, 문자열 사이의 두개의 점만 정해주면 3개로 나눌 수 있다. 따라서 2중 for문을 통해서 두개의 위치를 정하고, 마지막 값은 최소 단어 길이가 1인 단어가 나올 수 있도록. 위치가 정해지면, 문자를 거꾸로 저장하여 답을 구한다. 구한 답들을 sort 함수를 통해서 오름차순 정렬하고, 가장 첫번째 값을 출력한다 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include#include#include#includeusing namespace std;vector v;void getWord(int x, int y,string str){ st.. 더보기
2966번 2966번 - 찍기 브루트 포스문제로, 정답을 전부다 비교해보면 된다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include#include#includeusing namespace std;int n;char ans[101];int g[3];vector v(3); int checkAnswer(int p){ int grade = 0; int i = 0; int pos = 0; int size = v[p].front().first.size(); while (i 더보기

반응형