본문 바로가기

알고리즘/SWEA

(95)
7965 문제에서 요구하는 수식을 구하기 위해서 아래와 같은 식을 세울 수 있다. f(n) = f(n-1) + n^n 여기서 재귀와 메모아이제이션이 생각났다. 이 방법이 __solution() 이다. 그러나 이 방법은 최대 백만번에 재귀 함수 호출로 인해 스택 오버플로우 문제가 발생하여 사용하지 못했다. 그래서 매모아이제이션을 유지하면서 재귀 대신 반복문으로 진행하였다. 여기서 단순한 방법으로 n^n을 구하면 아마 타임아웃 문제가 발생할 것 같아서 좀 더 효율적으로 n^n을 구해야 한다. 임의의 짝수는 2의 거듭제곱 들의 합으로 구성되며 홀수는 여기에 "1" 만 더한 것이다. 15 = 1 + 2 + 4 + 8 이므로 15^15 = 15^(1 + 2 + 4 + 8) = 15^1 * 15^2 * 15^4 * 15^8..
7584 static int __solution(long long mid, long long off) { if (mid == off) return 0; else if (off > K; C = K; while (C != 1) //K보다 큰 2의 n승 중 최대값을 구함. { C >>= 1; mid
7732 static char * solution(void) { static char buf[16]; string s1, s2; int h[3], m[3], s[3]; cin >> s1 >> s2; h[0] = (s1[0] - '0') * 10 + (s1[1] - '0'); m[0] = (s1[3] - '0') * 10 + (s1[4] - '0'); s[0] = (s1[6] - '0') * 10 + (s1[7] - '0'); h[1] = (s2[0] - '0') * 10 + (s2[1] - '0'); m[1] = (s2[3] - '0') * 10 + (s2[4] - '0'); s[1] = (s2[6] - '0') * 10 + (s2[7] - '0'); if ((s[2] = s[1] - s[0]) < 0) { s[..
7853 abcd를 입력한다 했을 때 나올 수 있는 유형은 2 * 3 * 3 * 2 = 36이다. 해당 위치에 문자 양 옆을 보고 그 위치에 올 수 있는 문자의 개수가 정해지는 것이다. a 의 경우는 옆에 b 만 있으므로 a 또는 b 가 올 수 있어서 총 2가지가 있고, b 의 경우는 옆에 a와 c가 있으므로 a, b 또는 c가 올 수 있어서 총 3가지가 있다. 이런 식으로 곱사건을 구하는 것이다. 처음과 끝은 스페셜 케이스로 처리하였다. 문자 두개만 비교하면 되기 때문이다. 3개의 문자를 비교해야 하는 경우는 주석을 참고하면 된다. 반복문안에서 ret 을 1 000 000 007 을 나눈 나머지로 다시 초기화 하는 것을 생각하지 못해서 여러번 fail이 떴었다. 사실 처음에는 전체 결과에서 10억 7을 나눈 나..
7854. 최약수 [1. 정의] 최약수: 앞에 어떤 숫자를 붙여도 자기 자신을 약수 갖는 수. 예제 2 앞에 어떤 수를 붙여도 해당 수는 2를 약수로 갖는다. 12 5 앞에 어떤 수를 붙여도 해당 수는 5를 약수로 갖는다. 38275 [2. 요구 사항] 임의의 숫자 X 가 있을 때, X 보다 작거나 같은 최약수의 개수 X 의 범위는 [1, 10^9] [3. 해결 방법] 주어진 조건을 만족하는 수를 다음과 표현 할 수 있다. T = (R+X) T % X == 0 X = a*10^N + b*10^(N-1) + ... + z*10^0 각 계수는 모두 0 이 아닌 자연수 N < 9 인 경우 0 < [a ~ z] < 10 N == 9 인 경우, a == 1 이고 [b ~ z] 는 모두 0 R = a`*10^(N+1) + b`*10..