상근이가 빌딩에서 탈출하는 가장 빠른 시간을 구해야 한다시물레이션으로 생각해서 bfs를 돌려봤다 불부터 먼저 이동하고 그다음에 상근이가 이동한다상근이의 이동 거리를 구해두고 만약 상근이가 탈출지점 까지 올 수 있다면 거리를 출력한다! 코드가 더럽다 ㅎㅎ 억지로 짠 느낌이 든다 소스코드123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100#include #include #include #include #include us..
섬에서 가장 가까운 다리를 놓아 두 대륙을 연결 하려고 한다그 때 가장 짧은 다리의 길이를 출력하라! 먼저 섬을 각자 다른 숫자로 만들어 준다(dfs)그리고 만약 섬이 바다 옆에 있다면 bfs를 실행 시켜서 다른 섬을 가는 가장 짧은 거리를 반환한다! 그럼 반환된 값들 중 가장 작은 것이 답이 된다 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include #include #include #include using namespace std;int n, arr[111][111];..
유니온 파인드 & 리스트를 이용해서 풀 수 있는 문제다벽이 허물어 질 때마다 오른쪽에 있는 방과 합쳐주면 된다그리고 나의 오른칸을 부모의 오른칸으로 바꿔준다! 그럼 이미 부셔진 벽은 확인하지 않고 부셔지지 않은 벽만 확인 할 수 있다! 소스코드1234567891011121314151617181920212223242526272829303132333435#include #include #include using namespace std;const int MAXN = 1e6 + 5;int n, m,R[MAXN], p[MAXN];int find(int x) { if (x == p[x]) return x; return p[x] = find(p[x]);}void merge(int x, int y) { x = fin..
욱제의 팬클럽이 K개 있고 N명의 팬들이 있다그리고 N명이 어떤 팬클럽에 있는지 주어진다 우리에게는 2가지 행동이 있다1) 팬 X를 퇴출시키기2) 팬 X를 골라 양 옆으로 연속적이게 같은 팬클럽 사람들에게 선물을 준다 이 문제는 유니온 파인드로 풀 수 있는데 추가적인게 또 필요하다..!바로 List를 사용하는 것..! 진짜 list를 stl로 사용하진 않는다삽입은 없지만 삭제를 해야하는 상황에는 O(1)만에 사용할 수 있게 배열로 만들 수 있다. 처음배웠따 L,R 배열을 잡아주고 L에는 나의 왼쪽, R에는 나의 오른쪽 값을 넣는다그리고 1번과 N번에서는 각각 L[1] = -1 && R[n] = -1을 넣어준다 -1은 NULL값을 의미한다 그리고 x를 삭제하면 자료구조 시간에 과제 하듯이 L과 R을 이용해..
정말정말저마렂아멀장 마음아픈 문제다다 맞춰놓고 오버플로우가 생기게 코드를 짜서 쓸데없이 시간 낭비를 했다하하하하하 코드... inf값을 10억으로 막놨더니 100억까지 초과된다...이걸 못찾고 계속 로직을 바꾸려 해서 나의 아까운 시간을.....inf값 생각없이 막 두면 안되겠다.. 문제를 푸는 방법은1. 더러운 칸들을 번호를 매겨 벡터에 넣는다2. 각각의 더러운 칸들에서 bfs를 돌려 저장해준다3. next_permutation을 통해 언제가 가장 가까운지 구하면 된다!만약 갈수 없다면 -1을 출력해준다! 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758..
유니온파인드를 공부하고 싶어서 풀었는데 결국 아이디어는 못떠올렸다... 신박하다.... 멋있어... 유니온파인드...잘 쓰는법을 모르는데 공부해야겠다... 문제를 푸는 방법은 우선 공항에 비행기를 도킹할 때 항상 넣을 수 있는 가장 큰 수에 도킹한다. 이걸 이용해서 유니온 파인드를 한다. 만약 s에 넣는다면 s의 부모를 s-1로 바꾼다. 그럼 언젠가 0이 되어 버리는데 0이 되는 순간 도킹할 수 있는 자리가 없다는 말이다..! 신박해..! 공부해봐야겠다 소스코드1234567891011121314151617181920212223242526272829303132#include #include using namespace std;#define MAXN 100010int p[MAXN], n; int find(i..
졸려..나도..졸려..는.. 문자열..문..제..다눈..을..한번..감을..때마다.. 문자열이...바뀐..다....이..때..K번...눈을..감았을..때...원래...문자열을..찾느..문..제다..X가..딱봐도..너무...크므로..분명..싸이클이..있을테니..찾으면된다...찾아서..X를..%..해주고..진짜..거꾸로..돌려보면..된다.. 소스코드..1234567891011121314151617181920212223242526272829303132333435#include #include using namespace std;string s;char ans[1111];int k; int main() { scanf(" %d", &k); cin >> s; int n = s.size(); int c = n / 2..
문제의 조건이 많다 정리하자면1) 학교는 N개이고, 학생은 A[i]...A[N]명2) 대회의 팀은 1~200000까지 임의로 가능3) 대회에 나가려면 같은 학교 학생끼리 팀을 해야함4) 학교에서 대회를 나가려면 모든 학생이 팀에 포함되어 나가야 함5) 학교 예선 1등만 본선에 가고 본선은 최소 2팀이상 나와야 함 대회에 나가려면 학교 학생의 공약수로 팀을 이뤄야 한다그래야 모든 학생이 나갈 수 있다그럼 모든 학교의 공약수를 미리 구해두고 공약수 X 공약수를 가지는 학교의 최대값을 찾으면 된다!이 때 공약수를 가지는 학교가 2이상만 가능하다 200만 X 20만 ==롱롱 필수벡터로 구현했다가 메모리 터졌다 ㅎㅎ 소스코드1234567891011121314151617181920212223242526272829#..
모든 꼭짓점 (x,y)에 대해, 이 점을 공유하는 넓이가 같은 사각형의 수를 세는 문제다. 쉽게 푼 사람들은 쉽게 푼거같은데.. 난 더럽게 푼거같다 처음에 map만 써야되는데 아무 의미없는 set도 같이 써서 시간초과가 났다 문제는 꼭짓점 x,y를 정하고 그 점을 중심으로 양쪽 대각선 방향으로 넓이를 비교해주면 된다! 1) 왼쪽 위, 오른쪽 아래2) 오른쪽 위, 왼쪽 아래 이렇게 두번 보면 된다 위에있는 값들을 map에 넣고 수를 센다그리고 아래있는 값들이 map에 들어 있다면 답에 더해준다! 넓이를 구하는건 펜윅트리를 사용했다..! 그냥 배열로도 구할 수 있지만 갑자기 쓰고싶어서..! 소스코드12345678910111213141516171819202122232425262728293031323334353..
알파벳 최대 26개가 들어올 때 3글자가 일직선인 것의 수를 찾는 문제다진짜 직선만 완탐으로 다봤는데 바로 틀리더라문제를 푸는 방법은 CCW 였다....!잊고있었다 CCW.. 점 3개를 줄 때 직선이면 0을 리턴하므로 그걸로 답을 세면 된다 소스코드123456789101112131415161718192021222324252627282930313233#include #include #include using namespace std;int n;char arr[111][111];vector vt; bool ccw(int x1, int y1, int x2, int y2, int x3, int y3) { int ret = x1*y2 + x2*y3 + x3*y1; ret -= (y1*x2 + y2*x3 + y3*..