본문 바로가기

반응형

알고리즘

9095번 9095 - 1 , 2 , 3 더하기 문제의 조건이 굉장히 작아서 완전탐색으로 풀 수 있다고 생각했다. 하지만 값이 커질 경우에는 메모이제이션을 이용해야 할 것 같다.그래서 완전탐색, DP, 그리고 추가로 내가 PS를 처음시작했을 때 코드ㅋㅋㅋㅋ 이렇게도 풀었구나 싶은 코드 1. 완전탐색재귀 함수를 통해서 더해주면서 n값과 일치할 때까지 실행되도록 코드를 작성하였다. 1234567891011121314151617181920212223242526272829303132333435363738394041#include using namespace std;int ans;int n;void go(int num){ if (num > n) { return; } if (num == n) { ans += 1; return.. 더보기
11727번 11727 - 2xN 타일링 2 D[N] = 2xN 타일을 덮는 방법의 갯수라고 점화식을 세워서 풀었다. 풀면서 발견한 나의 문제점 => 기저 사례에 대해서 제대로 확인을 안한다는 점. - 기저 사례를 확인 할 때는 N-2,N-1 이기 때문에 1,2 를 넣어야 한다는 점. 그리고 기저 사례는 직접 계산을 해야 한다는 점. ##################풀면서 이상했던 점###################### 정답을 출력할 때, 나는 D[N]이 전역변수라 그냥 출력하면 될 줄 알았는데저런식으로 코딩할 경우 100프로에서 실패라고 떴다.그냥 go()함수를 출력할 경우에만 정답이라고 나왔다.???????????????????????????????????????????????????왜 그런지 이유를 파악해야.. 더보기
11726번 11726 - 2xn 타일링 처음에 완전 탐색으로 문제를 풀었다가 시간초과가 났다.그래서 DP로 접근해서 문제를 풀었다. D[N]= N칸을 채우는 경우의 수 라고 점화식을 세우고 문제를 풀었다. 123456789101112131415161718192021222324252627282930313233343536373839404142#include#includeusing namespace std; int D[1001];int n;int go(int N){ if (N > n; memset(D, -1, sizeof(D)); go(n); cout 더보기
1463번 1463 - 1로 만들기 1. 완전 탐색을 이용해서 풀기 재귀 함수를 이용해서 모든 케이스를 다 돌려보았다.재귀를 돌리는 중에 지금 현재의 최소값보다 큰 값이 나오면 return 해주는 방식으로 속도를 조금 빠르게 했다. 123456789101112131415161718192021222324252627282930313233343536373839404142#includeusing namespace std;int ans = 987654321;void go(int n, int cnt){ if (cnt > ans) { return; } if (n == 1) { ans = cnt > ans ? ans : cnt; return; } if (n % 3 == 0) { go(n / 3,cnt+1); } if (n % 2.. 더보기
외발 뛰기 (문제 ID: JUMPGAME, 난이도: 하) ★★★★★다시 풀어 볼 문제★★★★★ 알고리즘 문제해결 전략 1권외발 뛰기 (문제 ID: JUMPGAME, 난이도: 하) 나름 DP문제는 많이 풀어봤다고 생각했지만 , 이 문제처럼 TRUE FALSE로 답을 내는 문제는 처음이었다.내가 푼 DP문제들은 경우의 수를 구하는 문제가 대부분이었다.그러다 보니 약간 생소한 느낌이고, 다른 문제를 푸는 느낌이었다.그래서 풀어보는데 이해가 안가고 고민해야 했던 부분이 많았다. # 내가 지금까지 풀어온 DP는 뭔가 점화식을 정하고 풀어야 한다는 강박관념이 있었는데,이 문제는 그냥 재귀함수로 원하는 칸에 도달할 때까지 풀면서, 메모이제이션만 하면 됐다.물론 이 과정에서 점화식을 구하고 풀어도 되겠지만 딱히 점화식이라고 생각하지 않았다(개인적으로) 코드적 스킬은 마지막 .. 더보기
2445번 별찍기 - 8 별찍기 아래 단계부터 풀어오면서변수를 요리조리 조합해서 별의 갯수를 찍어도 보고 고민하다가다른 사람들 중 for문을 그냥 여러개 해서 간단하게 찍는 갯수만으로 하는 방식을 보고그 방식이 나한테 더 맞는 것 같아서 그 방식으로 풀었다.구글 검색을 하면 변수를 요리조리 한것도 있지만, 변수를 어떻게 할 것인가는 나에겐 좀 복잡해서... 간단하게 설명을 하면첫번째 줄에서 n번째 줄까지 첫번재 큰 for문을 통해 구했다.그리고 두번째 큰 포문에서 나머지 n-1 개의 줄을 구했다. for 문 안에서는 별 찍고 -> 공백 찍고 -> 별찍고 -> 공백찍고 이런식으로 돌아가는 4개의 for문으로 구성하였다. 코드1234567891011121314151617181920212223242526272829303.. 더보기
10818번 처음 문제를 보았을 때, 동적할당이 필요하니까 vector를 써야겠다고 생각하고, 일일이 v에 값을 집어넣은 후 최대값과 최소값을 비교해서 찾아냈다. 그리고 다시 두번째는 대소 비교하는 방식을 이용하는 코드로 짰다.나는 저 대소비교 방식을 잘 사용하지 않는데, 많은 사람들이 자주 이용하는 것 같아서 사용법을익히기 위해 한번 짜보았다. 그러면서 코드를 다시 보다가, 그냥 vector를 만들 필요없이 입력 즉시 대소 비교가 가능하다는 점을 발견했다.불필요한 코드를 줄일 수 있었다. 나는 대소 비교 보다는 max,min 함수를 자주 이용하곤 한다. 하지만 저 방식도 습득해야 겠다. 처음 코드 123456789101112131415161718192021222324252627282930313233343536373.. 더보기
1924번 난이도는 그렇게 높지 않은 문제였다.다만 예전에는 배열에 저런식으로 값을 넣지 않고 if문을 여러개 써서 풀던 나였다면 이젠 조금 바뀌었다. 하지만 문제 풀때, 1월부터 12월까지 날짜를 제대로 안읽고 7,8월이 31이라는 점을 잊고 맘대로 풀다가 실수했다.문제를 잘 읽는 습관, 정확하지 않은 배경지식을 사용하려 한 습관을 버려야 겠다. 코드 1234567891011121314151617181920212223242526272829#include#includeusing namespace std;int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };string day[7] = { "SUN","MON","TUE","WED","THU","FRI","SAT" };.. 더보기

반응형