목록Algorithm (428)
Mini
* 2차원이 안되는 이유처음설계 상태 : (y, x , 그때 벽부순 count)를 두고 bfs를 돌리기if(next_cnt >= 2) continue; #include using namespace std;typedef long long ll;struct A { int y; int x; int cnt; // 여기좌표에 올때까지 부신 벽의갯수 A(int y, int x, int cnt) : y(y), x(x), cnt(cnt) {};};int n, m, arr[1004][1004], vis[1004][1004];int dy[] = { 1,0,-1,0 };int dx[] = { 0,1,0,-1 };ll ret; //배정된 예산중 최대값queue q;int main(){ cin..
* 의사코드행동영역f(x) 정의시 최대, 최소를 쓰지마라. 우리는 이문제를 결정문제로 바꿔서 풀어야한다.간격을 고정하고 탐색하라. (x)로 고정.되는지를 구현하는게 사실 핵심이다. (go 함수)참인경우, st = mid 임에 주의 // en = mid 아님!go 함수 구현완탐하면서 간격 설치(cur갱신) , cnt+1설치된 공유기 갯수가 c 보다 큰지 return//설치간격이 x 일때, 공유기 c개 이상 설치 가능한지ll go(ll x) { ll cur = arr[0]; //현재 설치된 위치 ll cnt = 1; //공유기 설치갯수, 1st는 항상설치 for (int i = 1; i = c;}f(x) 정의, go 함수 구현 모두 빡센 문제였다.f(x)를 현재간격으로 "고정" 하고간격..
* 의사코드먼저 함수를 정의하라.0일때, 1일때 나눠서 st, en의 위치를 결정하라solve 함수를 작성하라.min을 이용해서, 둘중 적은것을 누적하고, 그게 예산이하인지 확인하면 되는듯?예외케이스 고려할 필요없는듯 하다.//배정예산 상한액이 x일때, 되는지ll go(ll x) { if (x > m) return 0; //상한액이 총예산을 넘어가는 경우 //모든 요청이 배정될수 있는경우 if (sum x) tmp += x; else tmp += arr[i]; } return tmp //by 바킹독bool solve(int uplim) { int sum = 0; for(int i = 0; i = sum;} * 전체코드solve 부분만 제외하면 바킹독님 코드와 ..
이 문제는 2회차푸는 문제다.x길이의 고정된길이로 막대를 자른다는 제약조건이 있다. (파악하기 힘들었음) * 매개변수 탐색 학습, 의사코드매개변수 탐색은 이분탐색의 응용편이다.f(x)를 정의하라. // f(x) : 랜선의 길이가 x일때, 갯수가 11개 이상이 나오는지.우선, f(1)과 f(끝)을 직접 구한다.랜선의 길이가 1일때, 갯수는 무조건 11개 이상이나온다.랜선의 길이가 max일때, 갯수는 무조건 1개이다.f(mid)가 참인경우같은숫자를 연결하면된다.즉, f(1) ~ f(mid)는 계산할필요없이 모두 1인것이다. 이경우, 우측으로 재귀적으로 재탐색하면 된다.이때, mid자체도 정답의 범위에( true이므로) 포함되기떄문에, st = mid로 둬야함에 주의f(mid)가 거짓인경우같은숫자를 연결하면된..
일단 이문제는 2번째 푸는 문제이다.근데 못풀었다...모 기업 코테에서 비슷한 문제가 나와 다시 복습하였다. * 못푼이유설계도가 없으니 중간에 막히면 코드만 수정함 -> 점점 스파게티가 되어 망하였다. 아래정도 설계는 꼭하자!* 의사코드25C7 구현vector를 넥퍼돌리면서 1인부분의 idx를 selected에 넣으면된다.이때, 지도에도 표시해둔다. //나중에 선택된곳만 갈수있도록 제한해야하니까.i/5, i%5를 이용해, 값을 2차원으로 바꿔준다.이다솜 cnt > = 4 구현selected를 순회하면서 arr을 검사한다.이후 4이상인 경우만 dfs 검사로 보낸다.이때, selected 중 아무 좌표나 하나 보내면 된다.dfs 구현 - version 1dfs는 연결된 갯수가 7개이면, 정답을 +1 하면된..
//25C7 구현 // N개의 요소를 가진 벡터 생성, 뒤에서 K개만 1로 설정 n = 25; vector v(n); fill(v.end() - 7, v.end(), 1); int cnt = 0; do { cnt++; /*for (int i = 0; i
https://leetcode.com/problems/partition-equal-subset-sum/solutions/1624939/cpython-5-simple-solutions-w-explanation-optimization-from-brute-force-to-dp-to-bitmask/* 완탐-내생각 : 200C1 + 200C2 + 200C3 + ,... + 200C 200 == 2^200 //빡세다..-답 : 이진트리로 쉽게생각하면됨 // num[idx]를 sum1에 넣기 or sum2에 넣기 == 2^200vector nums;class Solution {public: int go(int idx, int sum1, int sum2){ if(idx>=nums.size()){ ..
* 완탐-내코드{차이, idx}를 저장하고차이로정렬하고, idx로 원본에 다시접근하는방법매우 비효율적임.class Solution {public: static bool cmp(pair p1, pair p2){ if(p1.first==p2.first){ //인덱스작은거우선 return p1.second findClosestElements(vector& arr, int k, int x) { vector> gabs; //{차이, 인덱스} for(int i=0;i ret; for(int i=0;i- 정답코드굳이 idx를 저장할필요없이 차이로 원본배열을 정렬해버리면됨.class Solution {public: vector findCl..