본문 바로가기

Programming

(89)
[백준/C++] 2661번: 좋은수열 (DFS, 백트랙킹) DFS로 완전탐색을 하되 유망하지 않으면 탐색을 포기하는 기법을 백트랙킹이라고 한다. 이 문제도 역시 백트랙킹으로 푸는 문제이다! 1) 출력할 숫자를 어디에 담을 것인가? -> string에 계속 더해가자. 2) 가지치기 조건은? -> 부분수열이 같은지 체크해서 유효한 수일 때만 dfs! ( 반만 체크하면 된다.) **substr(pos, cnt) pos 위치부터 cnt 갯수만큼의 sub-string을 return #include #include using namespace std; int endFlag = 0; int N; bool isValid(string result) { int len = result.size(); int end = len - 1; for (int i = 1; i
[백준/C++] 1929번: 소수 구하기 (여러가지 소수 판별법) 제일 큰 수가 1,000,000으로 for문을 돌며 모든 수를 검사하면 시간초과가 난다. 2가지 방법으로 시간을 줄여보자. (+ endl 쓰면 모든 방법에서 시간초과 나니 '\n'로..) 1. 에라토스테네스의 체 방법 2부터 시작해서 해당 수를 제외한 해당 수의 배수들을 제거한다. #include using namespace std; #define size 1000001 int a[size] = { 0,1 }; int main() { int M, N; cin >> M >> N; for (int i = 2; i
[백준/C++] 9095번: 1,2,3 더하기 (DFS/DP) 1) DFS (모든 조합 체크) #include using namespace std; int test_case, N; int cnt = 0; void solve(int sum) { if (sum == N) { cnt++; return; } if (sum > N) return; for (int i = 1; i > test_case; for (int i = 0; i > N; solve(0); cout test_case; for (int i = 0; i > N; cnt = 0; for (int i = 4; i
[백준/C++] 9663번: N-Queen (DFS, 백트랙킹) 1) 기본가정: 같은 행에 Queen을 놓지 않는다. 2) 유망한 노드인지 확인하는 함수 - 같은 열이나 같은 대각선에 놓이는지 확인 -> 해당되면 유망하지 x - 같은 열 체크: col[i] == col[j] - 같은 대각선 체크: abs(col[i]-col[j]) == i-j #include using namespace std; int col[15]; int N; int cnt = 0; bool promising(int i) { for (int j = 0; j < i; j++) { if (col[j] == col[i] || abs(col[i] - col[j]) == (i - j)) return false; } return true; } void dfs(int i) { //i는 놓은 queen의 수이기..
[백준/C++] 1182번: 부분수열의 합 (DFS) 주의점 1) 연속된 수의 합을 찾는 것이 아니다. ex) N=4, sum=0, arr=[100, 100, 100, -100]일 때, 연속된 수의 합이라면 답이 1개이다. 하지만 (100,-100)조합이 3번 가능하므로 답이 3개이다. 주의점 2) 부분집합의 합이 아니니 중복이 포함된다. ex) N=4, sum=1, arr=[1, -1, 1, 2]일 때, 부분집합의 합이라면 [1], [-1, 2], [1, -1, 1]로 답이 2개이다. 하지만 첫번째 1과 세번째 1은 다른 1로 처리해야한다. 그래서 [1], [1], [-1, 2], [1, -1, 1]로 답이 4개이다. #include #include #include using namespace std; int N, sum; vector arr; int c..
[프로그래머스/C++] 124 나라의 숫자(진법 변환) 3진법인데 사용하는 숫자가 1,2,4 #include #include #include using namespace std; string solution(int n) { char nums[3] = {'4','1','2'}; string answer = ""; while(n){ answer = nums[n%3] + answer; n = n/3 - (n%3==0); } return answer; } DFS로 풀었는데 지저분 #include #include #include using namespace std; vector v; void dfs(int n){ if(n==1){ v.push_back(1); return; } else if(n==2){ v.push_back(2); return; } else if(n=..
[프로그래머스/C++] 징검다리 건너기(이분탐색) 이 문제의 경우 효율성 점수가 있는데 이 말인 즉슨 이분탐색을 떠올려야 한다는 뜻이다. 하지만 나는 떠올리지 못했다...(눈물) 여튼, 쉽게 풀려고하면 '돌다리 건널 수 있는지 판단하기 -> 돌다리 건너기(숫자줄이기)'로 풀 수 있지만 시간이 너무 오래걸린다. 그러므로 시간을 줄이기 위해 돌맹이가 가질 수 있는 숫자가 최대로 건널 수 있는 사람의 수라는 것을 생각하고 이분탐색으로 풀수 있다. 1) 조건을 정한다. 2) 이분탐색한다. 1) 조건: "임의의 숫자를 뺐을 때 0보다 작은 돌맹이가 연속해서 K개 있는가?" 2) 이거 기준으로 건널 수 있는 사람의 수를 이분탐색을 진행하면 된다. #include #include #include using namespace std; bool binarySearch(..
[프로그래머스/C++] 불량 사용자(DFS) 푸는 방법은 크게 두가지 인 것 같다. 1)DFS 2)비트마스크 나는 비트마스크를 몰라서 DFS로 풀었고 중복없이 담아주는 set container를 이용하여 조합을 만들었고, set container의 size를 return했다. set은 처음 써봤는데 유용하다!! 유사문제로 백준 1987번 알파벳문제가 있다. #include #include #include #include using namespace std; bool visit[8]; //방문처리 set ansList; //답이 되는 조합을 담는 set -> 크기를 return하면 된다. bool starcmp(string ban, string user){ /* banned_id와 user_id가 일치하는지 판단 */ if(ban.size()!=us..