본문 바로가기

반응형

전체 글

3407번 3407번 - 맹세 이 문제 거의 이틀을 잡고 있었다... 재귀로 풀다가 시간초과.. 그래서 다시 고치면서 풀었더니 메모리 초과로 계속 골머리를 앓았다. 그래서 백준 슬랙을 통해서 갓님들의 피드백을 구했고, 어떤 갓님께서 직접 전화 통화로 설명해주셨다. 사실 생각보다 굉장히 심플했다, 내가 아주 복잡하게 파고들다 보니 그 속에 갇혔던 것 같다. 결국 마지막에 복기해보니, 나는 중간에 check를 해주는 처리를 해주지 않았다는 것을 깨달았다. 문자를 만들어갈때, 만약 map 을 통해 중복되는 문자를 체크하면 어땠을까 싶다. 즉 어떻게 해서든 한 단어를 만들어냈다면, 그 과정은 중요하지 않기 때문이다. 그 다음만을 생각하면 된다. 나는 계속 단어를 처음부터 만들어내는 방식으로 문제를 풀었고, 그러다보니 체크.. 더보기
1342번 1342번 - 행운의 문자열 각 문자열의 갯수를 세고, 앞의 문자랑만 다르게 하면서 재귀함수를 이용해서 구현하면 된다. 백트래킹 문제 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include#includeusing namespace std;int cnt[26];int ans = 0; void go(int n,int p){ if (n == 0) { ans += 1; return; } for (int i = 0; i 0 && i!=p) { cnt[i] -= 1; go(n - 1, i); cnt[i] += 1; } } }int main(){ ios::sync_with_stdio(false); cin.tie(.. 더보기
2210번 2210번 - 숫자판 점프 로직은 숫자를 string을 이용해서 만들고 stoi 함수를 이용해서 만들었다. (10^6을 곱하고 이런는게 귀찮아서) 그리고 6자리 숫자를 만들었는지 안만들었는지 확인하는 check 함수를 만들었다. 5x5 이기 때문에 출발하는 한칸에서 네방향을 5번 해야되므로 4^5 * 25칸이므로 시간안에 충분히 통과할 수 있다고 생각했다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include#includeusing namespace std;int map[5][5];bool check[1000000];int dx.. 더보기
1941번 1941번 - 소문난 칠공주 처음에 단순히 dfs 백트래킹으로 풀려고 했으나, 십자가 중간에 튀어나온 모양은 dfs로 풀기가 어려웠다. 삼성에서 기출문제로 나왔던 문제가 있었는데, 그 문제는 dfs 로 돌리고 남은 모양은 직접구해서 맞추는 문제였다. 하지만 이 문제는 그러한 방식으로 조차 풀 수가 없었다. 그래서 다른 사람들의 코드를 봤다. 로직은 항상 25개 중에서 7개를 뽑는 식이기 때문에 go 함수를 통해서 7개의 수를 뽑는다. 이때 가지치기를 통해서 Y가 4개 이상이면 return 해주는 방식으로 문제를 푼다. 여기서 배운 스킬은 맵을 0 ~ 24까지 숫자로 놓으면 x,y 좌표는 [번호/n][번호%n] 이 된다는 점이었다. 이를 가지고 7개의 수를 뽑는 방식도 쉽게 풀 수 있었다. 그리고 뽑은 7.. 더보기
2023번 2023번 - 신기한 소수 처음에 에라토스테네스의 체를 이용해서 문제를 풀려고 했지만, 오히려 메모리 초과가 발생했다. 그래서 질문 게시판을 보고 힌트를 얻어서, 재귀함수를 통해서 정답을 구했다. 앞에서 부터 숫자를 채워가면서, 그 수가 소수인지 판별하는 함수를 만들어서 확인해줬다. 맨 앞 숫자는 0과 1이 들어가면 안된다는 점을 예외로 체크해줬다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include#include#include#includeusing namespace std;int n; bool checkPrime(int num){ for (int i = 2; i*i 더보기
2661번 2661번 - 좋은 수열 로직은 작은 수를 만들으라고 했기 때문에, 1-2-3 순서로 넣어가면서 넣어지면 바로 다음 단계로 넘어가면 된다. 다음 수를 넣을 때는, 우선 기본적으로 이전의 수는 뛰어넘도록 했다. p!=i 인 구문 그 다음으로 체크 함수를 통해서 문자열이 만들어졌을 때, 문자열 길이를 기준으로 반나눠서 끝에서 부터 한개, 끝에서 두개, 이런식으로 비교를 하도록 만들었다. 이때 substr 함수를 써서 string 을 쉽게 다룰 수 있었다. 평소에 substr 함수는 인자를 한개만 넣어서 사용했는데, 두개 넣을 경우 시작점과 갯수를 넣어주면 된다. 처음에 시작점과 끝점을 넣는 줄 알고 풀다가 오류가 발생했다. 12345678910111213141516171819202122232425262728.. 더보기
입력 속도 측정 https://www.acmicpc.net/blog/view/56 http://codecollector.tistory.com/381 cin, cout 이 scanf,printf 보다 빨라질 수 있다는 걸 오늘 알았다. 더보기
1339번 1339번 - 단어 수학 기본적인 로직은 만약 ABC라고 할 경우 , c라는 벡터 배열에 C 1개, B 10개, A 100개 라고 넣어준다. 그리고 이 c 벡터 배열을 sort 하고 가장 많은 값부터 9를 집어넣어서 수를 만들면 최대값이 완성된다. ## substr 사용법을 잊어버려서 다시 공부했다. substr(a)는 a번 자리부터 마지막까지 문자열을 반환하기 때문에, 이 문제에서는 문자열을 처음에 reverse 시켜주고 문제를 푸는데 사용했다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include#include#include#includeusing namesp.. 더보기

반응형