본문 바로가기

코드포스

[코드포스 Practice15] C. Odd sum 음.. 풀다가 왜맞틀하다 끝난 문제 지우는 건 가능하되 순서 바꾸는 건 불가하다. 하지만 결국 순서 섞어서 선택해도 똑같은거 아닌가 싶었음. 그래서 정렬해서 투포인터로 앞에 것부터 뺐다. 하지만 틀렸길래.. 예시 하나하나 돌려 봤는데 -999 -998 이런 경우에서 틀렸다. 이거 답은 -999인데 내 코드로는 -1997이 나온다. 생각해보니 값 하나하나 비교하지 않은 것 같아서 값 하나씩 비교하는 걸 추가했다. 그래도 결국 12에서 계속 틀림.. 이제 콘테스트로 끝났으니 12를 확인해봅시다.. 10 4836 -2331 -3456 2312 -1574 3134 -670 -204 512 -5504 내 답은 6015가 나오는데 정답은 8563이 나온다. 오 확인해보니 이런 문제가 있었다. 그 다음 생각한 걸로는.. 더보기
[코드포스 Practice15] B. Chtholly's request 음~ 회문 (뭔지알지) 음 ~ 짝수로? 오케~~ 회문을 다 찾으라고?? mod로 나누라고??? 헉 어렵군 몰겠서 패스 한 문제였다. 이것도 어렵게 생각했던 거였는데 간단히 정리하면 반만 생각하면 된다. 반이 1부터 100000까지 숫자이고 이걸 대칭으로 붙이면 되니 1 ~ 100000 반복문 -> 숫자를 문자열로 바꿈 -> 문자열을 뒤집어서 붙임 -> 다시 숫자로 바꿔서 sum으로 합친다 끝~~ 정말 간단한 문제였다.... k까지 회문을 구해서 더하면 되는 문제... 이걸 내가 어디서 겁먹었나 생각해보면 (ㅋㅋ 지금 생각하면 좀 웃기다) 뭔가 회문 구하는 게 귀납법을 써야할 것 같다! (내가 잘 못쓰는 기법으로 풀 것 같음) 더하는데 mod로 나눈다고? 더할 때 오버플로우 나지 않을까? - 그래서 mod.. 더보기
[코드포스 Practice15] A. Alphabetic Removals 알파벳 개수를 센 다음 a부터 k개수 만큼 뺀다. 그 다음 남은 개수만큼 출력하면 될 꺼라 생각했음.. 하지만 제출하고 생각해보니 이렇게 짜면 앞에서 남은 개수만큼 출력하게 된다. #include #include #include #include #include #include using namespace std; using i64 = long long; int main() { int n, k; scanf("%d %d", &n, &k); string s; cin >> s; vector alpha(26, 0); vector origin(26, 0); for (int i = 0; i < n; i++) { alpha[s[i] - 'a']++; origin[s[i] - 'a']++; } int count = 0;.. 더보기
[코드포스 Practice15] 후기 악ㅋㅋㅋ 1문제 맞췄다 저번 글에 음~ 이제 적응한 듯 ^~^ 했는데 바로 한문제 맞춰버리네 ^////^ 이번 후기를 적으면.. A번은 좀 빨리 풀었는데 문제 이해를 잘못해서 다시 고친다고 시간 걸렸고 B는 이걸 어떻게 접근해야할지 몰라서 넘기고 C는 12번 테케가 틀려서 ㅋㅋ 원인 못 찾고 끝나고 D도 어떻게 풀어야 할지 몰랐다. 시간을 보면 A (30분) -> B (10분) 문제읽고 바로 못풀 것 같아 패스 -> C (30분) 코딩하고 제출했지만 틀림 -> 이 이후로는 D문제 풀려고 깔작거리다가 계속 C만 잡았음 다시 풀어봐야겠다ㅎㅠ PS길은 빡세구나 미래의 나에게 혹시 퍼플까지 갔니 퍼플까지 갔다면 넌 맨날 퍼플 부심 부리고 다니겠지 오늘 1솔브를 했다는 걸 잊지마렴... 더보기
[코드포스 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.. 더보기