본문 바로가기

전체 글

[코드포스 Practice14] E. Balanced Ternary String ㅠ____ㅠ 코드가 더럽다 근데 이 방법 밖에 생각 안 나서 어쩔 수 없었음 (게다가 맞긴 맞았다) 먼저 간단히 제외할 수 있는 경우를 제외했다. 처음부터 2 / 2 / 2 처럼 개수 맞게 들어온 경우는 바로 출력하고 종료 다음으로 아예 더러운 경우 (전부 0 / 000000) 이런건 0 - 1 - 2 순서대로 출력하고 종료 이제 남은 건 012 전부 개수가 안 맞거나 하나는 0이고 나머지 두 개만 맞는 경우만 남았다. 그 중 하나 0이고 나머지 두 개만 조정하는 것부터 코드짰다. 0이랑 2인데 2가 더 필요하면 뒤에서부터 0을 2로 고치고.. 0이 더 필요하면 앞에서부터 2를 0으로 고치고.. 이런 식으로 로직짰음... #include #include #include #include #include #.. 더보기
[코드포스 Practice14] D. Secret Passwords 워... 신기한 발상.... 알파벳 전부 포함해야해서 루트에 벡터 만들어서 알파벳 뭐 있는지 저장하는 걸 만들까 했는데 좋은 방법이 있었다. 알파벳만 저장하는 저장하는 벡터를 만들어서 그 알파벳이 나온 집합의 번호를 저장한 다음에 그걸 merge 시킨다. 글로 적으니 설명하기 어렵네 위의 사진을 보세용 #include #include #include using namespace std; vector parent; vector alphabet[26]; void init(int n) { parent.resize(n + 1); for (int i = 1 ; i s; for (int j = 0; j < s.size(); j++) { alphabet[s[j] - 'a'].push_back(i); } } init(.. 더보기
[코드포스 Practice14] C. Drazil and Factorial tmi이긴 한데 이거 풀 때 카페에서 뭐라는~~거야~~~ 하는 노래 나와서 집중 너무 안 됐다ㅋㅋㅋ 문제 해석하고 있는데 자꾸 웃겼음ㅋㅋㅋ 이 문제는 구현 어떻게 할지 생각 좀 하느라 시간 걸렸다. 보면 숫자를 풀어헤치고 그걸 다시 팩토리얼로 만들면 됐다. 이걸 어떻게 코드로 짜지?? 생각하다가 자리수 하나마다 규칙이 있길래 모든 자리수마다 규칙을 적용했다. #include #include #include #include #include #include using namespace std; using i64 = long long; int main() { int n; scanf("%d", &n); char tmp; scanf("%c", &tmp); vector num(8, 0); int state = 0;.. 더보기
[코드포스 Practice14] B. Find The Bone 풀이는 간단하다. k개 swap을 하면서 뼈다귀를 섞는데 바꿀 위치가 구멍인지 아닌지 파악하면 된다. 여기서 구멍인지 아닌지 파악하는 부분을 단순히 찾으면 시간복잡도가 O(N)이 걸려서 전체적으로 O(N^2)이 된다. 그래서 이걸 이분탐색으로 바꿔 O(NlogN)이 되게 했다. 찾는 함수는 lower_bound를 썼음 #include #include #include #include #include #include using namespace std; using i64 = long long; int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); vector v(n + 1, 0); v[1] = 1; vector h(m); for (int i = 0; i < m.. 더보기
[코드포스 Practice14] A. Cheap Travel 좀 쉬워서 놀랬다. A가 이정도는 아니었는데?? (근데 한 번 틀렸음ㅋㅋ) m * a랑 b랑 비교하면 되는 문제였다. 만약 b가 더 작으면 n개 중 되는대로 m개를 채우고 남은건 a로 채우면 되겠다 싶었다. 그런데 틀렸다ㅋㅋ 전에 양념치킨 문제랑 비슷하게 틀려서 빨리 찾을 수 있었음. 양념치킨 문제에서 딱 n개만큼 안 사고 싸다면 더 많은 양을 사면 됐다. 이 문제도 b가 터무니없이 싸면 그냥 n개 이상으로 사도 괜찮았다. 이거 고치니 맞았다ㅎㅎ #include #include #include #include #include #include using namespace std; using i64 = long long; int main() { int n, m, a, b; scanf("%d %d %d %d".. 더보기
[코드포스 Practice14] 후기 ㅋㅋㅋㅋ 이렇게 말하면 곧 북님이 난이도 올리겠지만 이 난이도에도 적응한 것 같다. 전에는 아 너무 어렵고 한문제도 못 풀겠고ㅠㅠ 이걸 어떻게 풀지 1문제도 할까말까 하는데.. 거렸지만 지금은 시간만 된다면 c까지는 풀 수 있을 것 같다! 워후! 혹시 너무 어려워 해서 깜짝으로 난이도 낮춰주신거 아닐까 ^___^ 뿌듯스 암튼 오늘은 시간이 부족할 뿐 잡은 문제는 다 풀었다. 다만 문제가 있다면 서버 두번이나 터졌음ㅋㅋㅋ 진짜 이 화면만 10분씩 두번ㄴ이나 봤다고 진짜 어이없고 화나고 ????? 했는데 서버 터짐ㅋㅋㅋ C번이라도 열어놨으면 C번 풀고 있을텐데 이런 상황을 처음 겪어봐서 그냥 10분동안 기다렸음ㅋㅋㅋㅋㅋ ㅇㄴ 겨우 기다렸더니 B번 틀렸다라ㅎ B번 좀 더 만지다가 1시간 지났길래 놔두고 C번 .. 더보기
[코드포스 Practice13] D. Which floor? 코포 끝나기 좀 전에 어떻게 풀지 감 잡아서 결국 못 풀었다. 로직은 저 아래쪽에 있는 거 그대로 짰다. step이 1일때 ~ 50까지 배열 전부를 확인한다. 주어진 거랑 맞으면 위치 저장하고 다음거 계속 확인한다. 만약 일치하는게 있는데 이미 위치가 저장되었다면 그건 모호하게 되므로 -1출력하고 종료.. 진짜 짜면서 너무 재밌고 즐겁고 내 코드에 확신하면서 제출했는데 3번에서 틀렸다. 이 경우에서 틀렸는데 나는 이렇게 하면 1 1 1 1 2 2 2 2 도 되고 1 1 1 1 1 2 2 2 2 2 도 되니깐 틀린거로 봤다. 알고보니 이 두 경우 모두 8이 2이므로 참으로 해야했다. 그래서 step 확인하는 부분만 바꿨고 맞았다. if (ans == 0) ans = (n + step - 1)/step; e.. 더보기
[코드포스 Practice13] C. Save the problem! 처음 이 문제 봤을 때 너무 방대해서 어떻게 하나 했다ㅋㅋㅋ 너무 방대해! 조건도 없어! 뭐부터 건드려야할지 몰라서 패스했다. 다시봐도 모르겠다. 그래서 힌트 얻어왔음 이렇게 조건없이 탁 트인 문제는 직접 제약조건을 걸어주면 좋다. 동전 종류가 1개일 때, 2개일 때.... 동전 개수 제약을 걸면 이렇게 규칙이 나온다. 종류가 1개일 때는 무조건 1가지이고 종류가 2개일 때는... 1원과 2원만 있으면 모든 수를 다 만들 수 있다! #include using namespace std; int main() { int a; scanf("%d", &a); if (a == 1) { printf("%d %d\n", 1, 1); printf("%d", 1); } else { printf("%d %d\n", 2 * .. 더보기