Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
문제
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
풀이
팰린드롬이란 거꾸로 읽어도 동일한 회문을 의미한다.
start번째 수부터 end번째 수까지가 팰린드롬임을 확인하려면
일단 arr[start]와 arr[end]가 같아야 한다.
그 후 arr[start+1]에서 arr[end-1] 까지가 팰린드롬이라면 해당 수열은 팰린드롬임을 알 수 있다.
즉, arr[start]에서 arr[end]까지를 확인할 때 arr[start+1]에서 arr[end-1] 까지가
팰린드롬의 여부를 확인하므로 결과 값을 저장하는 DP방식으로 구현해야 반복 연산을 막을 수 있다.
bool dp[2001][2001] //dp[start][end]가 팰린드롬인지의 여부를 저장
dp[start][end] = dp[start+1][end-1];
구현에 앞서 start==end인 경우 수열에 수가 단 한 개이기 때문에 항상 true임을 저장하고 시작하자.
for문을 순회할 때 1차 for문은 end값으로 하고, 2차 for문의 start의 값은 end미만까지로 제한해야 시작점(start)이 끝점(end)보다 커지는 경우를 제한할 수 있다.
arr[start]== arr[end]이고
end - start >=2인 경우 수열은 3개 이상의 수로 이루어져 있으므로
dp[start][end] = dp[start+1][end-1];
로 계산된 값을 사용한다.
end - start >=2가 아니라면 수열은 두 개의 수만으로
즉, arr[start]와 arr[end]만을 포함하므로 바로 true값을 저장해준다.
dp[start][end] = true;
코드
'알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] No.1328 - 고층 빌딩 (C++) (0) | 2020.12.08 |
---|---|
[백준] No.13398 - 연속합2 (C++) (0) | 2020.12.06 |
[백준] No.2482 - 색상환 (C++) (0) | 2020.12.02 |
[백준] No.2629 - 양팔저울 (C++) (0) | 2020.12.02 |
[백준] No.12865 - 평범한 배낭 (C++, 배낭 문제) (0) | 2020.12.01 |