문제

접근 방안

dp문제이다.

처음 dp로 하지 않고 구현으로 하였다 틀렸다.

틀린 코드

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
    int input, input2;
    cin >> input;
    int arr[2001] = { 0, };
    for (int i=1; i<=input; i++) {
        cin >> arr[i];
    }
    cin >> input2;
    int *arr2 = new int[input2];
    int s,e,k=0,b=1;
    for (int i = 0; i < input2; i++) {
        b = 1;
        cin >> s >> e;
        while (s != e && s < e) {
            if (arr[s] != arr[e]) {
                b = 0;
                break;
            }
            s++;
            e--;
        }
        arr2[k] = b;
        k++;
    }
    for (int i = 0; i < input2; i++)
        cout << arr2[i]<<endl;

    return 0;
}

틀린 코드의 풀이 방식은 홍준이가 명준이에게 물어볼떄마다 일일이 아닌지 맞는지 찾았다.

당연히 시간초과. 이 문제의 핵심은 0.5초이다.

풀이방법

if(arr[i]==arr[i+j] && dp[i+1][i+j-1]==1)
dp[i][i+j]=1;

즉 i와 i+j가 같은데 그 사이 값이 팰린드롬이면 i~i+j까지는 팰린드롬이라는 의미이다.

문제에서 실수한 부분

cin, cout을 쓰면 시간 초과가 되어 printf, scanf를 써야한다.

scanf_s, printf_s로 하면 컴파일 에러가 나니 scanf,printf로 쓰도록 한다.

코드

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int input, input2;
    scanf("%d", &input);
    int arr[2001] = { 0, };

    for (int i = 1; i <= input; i++) {
        cin >> arr[i];
    }

    int s, e, k = 0, b = 1;
    int **dp;
    int c, l;
    dp = new int *[input + 1];
    for (int i = 0; i <= input; i++) {
        dp[i] = new int[input + 1]();
    }

    for (int i = 1; i < input; i++) {
        dp[i][i] = 1;
        if (arr[i] == arr[i + 1])dp[i][i + 1] = 1;
    }
    dp[input][input] = 1;
    int x = 1;
    for (int j = 2; j <= (input - 1); j++) {
        for (int i = 1; i <= (input - j); i++) {
            if (arr[i] == arr[i + j]&&dp[i+1][i+j-1])
                dp[i][i + j] = 1;
        }
    }

    cin >> input2;
    int *arr2 = new int[input2];

    for (int i = 0; i < input2; i++) {
        scanf("%d %d", &s, &e);
        printf("%d\n", dp[s][e]);
    }
    return 0;
}

+ Recent posts