
레고 조각의 길이를 저장해서 정렬한 후 이분탐색으로 풀 수 있는 문제다 0부터 확인해서 구멍을 막을 길이가 정확하개 된다면 => mid값을 찾는다면 출력하면 된다 처음에 set으로 모두 저장하고 풀려고했는데 시간초과가 났다 아무래도 값이 커서 저장하고 찾는데 시간이 오래걸리나보다 그래도 5초나줬는데..!! 집착하지말고 이분탐색으로 풀자! 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include #include #include using namespace std; int t,n; vector vt; bool bs(int pos,int val){ i..

lower_bound를 이용하여 풀 수 있는 문제다 x축에서의 좌표를 홀,짝으로 나눠 높이를 저장하고 높이 y로 지나갈 때 각각의 좌표를 지나가는지 확인하면 된다 이 부분을 배열을 정렬하고 lower_bound를 이용한다면 쉽게 구할 수 있다 홀수 일때는 찾을때 높이에서 빼서 거꾸로 찾으면 된다 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include #include #include using namespace std; int n,h; int ans[200020]; vector odd,even; int main(){ //freopen("input.txt","r",stdin); sca..

이 문제는 lower_bound && upper_bound를 이용하여 풀었다 반드시 연속적인 부분을 잘라야하고 피자가 원이라는 것을 잘 생각해야한다! 그럼 원에서 연속적인 부분들의 값을 각 피자의 배열을 만들어 넣고 lower_bound와 upper_bound를 이용해 각 피자에서 나올 수 있는 값과 수를 찾아서 곱하면 답이된다 코드에서는 원이기때문에 1~n이 아닌 1~2n까지 배열을 잡고 맨 뒤어서부터 시작해 만들 수 있는 값도 배열 넣었다 그리고 0과 sum[1~n]값은 한번만 나올 수 있으므로 마지막에 따로 넣어주었다 값을 다 넣고 크기가 P인 피자를 만들때 A에서 i를 찾고 B에서 P-i를 찾은 후 곱해주며 다 더하며 답이다! 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1..

BFS를 이용한 문제이다 층의 개념을 가져온다고 생각하자 => dist[x][y][층] 이런식으로 테이블을 잡는다 벽을 부술때마다 우리는 한층 씩 올라간다! bfs를 돌리고 목적지에서 min(dist[x][y][0~1층])이 답이된다 갈 수 없는 경우는 구해서 처리해주자 문제를 풀 때 다익스트라로 될거라고 착각하고 열심히 틀렸다 0은 가중치 1, 1은 가중치 100만을 주고 마지막에 백만으로 나누고 나머지를 구했다 다익스트라로 나처럼 풀면 한개만 부수고 최단거리인 경우를 못찾는다 => (1개부수고 최단거리) 대신에 (안부수고 더 긴거리)를 선택한다 잘 생각해서 풀자..!! 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ..

BFS+비트마스크를 이용해서 푸는 문제이다 BFS를 돌리며 내가 가진 열쇠를 비트를 이용해 표현해보자!! dist[x][y][가지고 있는 열쇠]로 테이블을 잡고 출발위치에서 다 돌려보자 그 후 출구에서 열쇠의 모든경우의 최소값을 찾으면 그게 답이된다! 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #include #in..
삼성SDS 알고리즘 문제집에 있길래 풀어봤따소수 2개의 곱 p를주고 , p를 만드는 소수 a,b중 하나라도 k보다 작으면 BAD 아니면 GOOD을 출력한다p는 넘넘크다 그래서 k까지 소수구하고 나눠보면 된다 ㅎㅎp는 크니까 string으로 받아야한다..! 소스코드1234567891011121314151617181920212223242526272829303132333435#include #include #include #include using namespace std;const int MAXN = 1e6 + 3;bool check[MAXN];vector prime;string s;int k;bool go(int x) { int ret = 0; for (int i = 0; s[i]; i++) { ret *..
좌표 6개 + 도착지점 1개 = 총 7개다그럼 7!로 모든 순서를 보자 => next_permutation을 이용해서..!좌표에 갈때는 map을 이용해서 순간이동을 시켜주고 +10 시켜줬다마지막 도착지에 도착하면 그만 본다 소스코드123456789101112131415161718192021222324252627282930313233343536373839#include #include #include #include #include using namespace std;#define ll long longvector vt(7);vector arr(7);map mp;ll sx, sy, ex, ey, ans = 1e15;ll dist(ll x1, ll y1, ll x2, ll y2) { return abs(x1..
문제를 읽고 그림을 그려보면 플로이드 문제인게 보인다각각 친구보다만 x-d~x+d 이기 때문에 max(두 정점사이거리)*d가 답이다 소스코드12345678910111213141516171819202122232425262728293031323334353637#include #include #include using namespace std;int d[55][55];char a[55][55];int n, k;int main() { scanf(" %d %d", &n, &k); for (int i = 0; i
역시나 오늘도 문제 조건을 빼먹어서 틀렸다 ㅎㅎ 굿 곰은 1000마리 까지 들어오고 차이는 1백만 까지 들어온다그럼 다 set에 넣고 확인해보면 된다 1. 먼저 set을 하나 만들어 주자2. 곰의 위치 A[i]를 받자3. set에서 A[i]-d에 대한 lower,upper_bound를 확인하자4. lower는 같거나 && A[i]+d보다 같거나 커야한다5. upper는 A[i]+d보다 같거나 크고 s.end()여야 한다6. 만약 조건에 맞으면 출력 ㄱㄱ 하고 set.insert7. 조건 틀리면 앞에서부터 찾아야 하므로 set 다 뒤지면서 똑같이 ㄱㄱ8. 이 때 A[i]보다 같거나 커야한다 모든 위치는 ㅎㅎ(빼먹으면 틀림) 소스코드123456789101112131415161718192021222324252..
문제를 읽어보면 최대값은각 정점에서 가장 먼 정점과의 거리 중 최소값이다 트리의 지름 공부할 때 배워둔각 정점에서 가장 먼 거리를 구하면 된다 ㅎㅎ유용하게 쓰이는 것 같다 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include #include #include #include using namespace std;const int MAXN = 1e5 + 5;vector Graph;bool check[MAXN];int n, dist[MAXN], dist2[MAXN], far[MAXN]; void dist_dfs(int x) { check[x] = true; for (int i = 0; i