반응형
문제 출처 :
https://www.acmicpc.net/problem/10942
알고리즘 분석 :
팰린드롬이란? 1 2 2 1처럼 앞의 수와 뒤의 수가 같은것을 의미한다.
즉, 반으로 나누어서 거울처럼 겹쳐지는지 확인하여 겹쳐지면 팰린드롬이다.
1 3 1은 팰린드롬이지만 1 2 3 은 팰린드롬이 아니다. (1,3이 같은 수가 아니므로)
다이나믹 프로그래밍으로 풀라는 힌트가 존재하지만, 어떤 이유에서 그렇게 풀어야 되는지는 잘 모르겠다.
하지만 DP가 아니고도 단일 for문으로 해결 할 수 있기에 알고리즘의 시간 복잡도 및 공간 복잡도 면에서는 부담이 덜 되는 알고리즘이다.
소스 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <stdio.h> int main() { int n,m, arr[2001]; int start, end; int tstart, tend; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &arr[i]); // m == tCase scanf("%d", &m); for (int i = 0; i < m; i++) { scanf("%d %d", &start, &end); // start를 1로 지정하면 배열의 처음(0)을 의미하니 tstart, tend에 각각 -1씩 해준다. tstart = start - 1; tend = end - 1; // for문의 순회는 start + end의 절반만 돌면된다. ex) 1 2 3 4면 1 2까지만 돌면 된다. for (int j = start; j <= (start + end) / 2; j++) { // 앞과 뒤의 수가 일치하면 if (arr[tstart] == arr[tend]) { // 순회의 끝이라면 if (j == (start + end) / 2) { printf("1\n"); break; } tstart++; // tstart는 증가, tend는 감소(다음 수 계속 확인) tend--; } // 하나라도 틀리면 팰린드롬이 아니다. else { printf("0\n"); break; } } } } // This source code Copyright is Crocus // Do you want to see more contents? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1789번] 수들의 합 (0) | 2016.07.09 |
---|---|
[10829번] 이진수 변환 (0) | 2016.07.09 |
[11047번] 동전 0 (Greedy Algorithm) (0) | 2016.07.05 |
[11399번] ATM (Greedy Algorithm) (0) | 2016.07.05 |
[11048번] 이동 하기 (Recursive, Dynamic Programming) (0) | 2016.07.05 |