일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- Python
- Algorithm
- Refactoring
- Network
- 블록체인
- Ethereum
- rust
- 플랫폼
- 이더리움
- 동시성
- 파이썬
- Fast API
- BAEKJOON
- Thread
- AWS
- Container
- Kubernetes
- fluent python
- function
- 러스트
- 코어 이더리움 프로그래밍
- RabbitMQ
- guru
- BlockChain
- IMAGE
- 전문가를 위한 파이썬
- dockerfile
- docker
- 알고리즘
Archives
- Today
- Total
글쓰기 | 방명록 | 관리 |
Victoree's Blog
1509_팰린드롬 분할 본문
728x90
Concept & Idea
이전에 풀었던 팰린드롬? 의 문제의 코드를 이용해서 문제를 해결할 수 있었다.
DP를 두 번에 걸쳐서 이용해야 했다.
일단 DP를 이용해서 i부터 j까지 팰린드롬인지 아닌지를 체크했다.
두번째는 약간 팰린드롬을 체크한 DP배열을 이용해서 분할의 최소값을 구하는 것이었다.
D[i] = min(D[j-1]) + 1
이 공식을 생각하는 것이 어려웠다.
이 문제를 풀때 런타임 에러를 두 번이나 실수했다.
우선 팰린드롬? 문제를 풀 때는 인덱스를 1부터 시작했는데, 이 문자열을 0부터 시작하려고 하니까 계속 실수를 하게 되었다.
1. 두번쩨 for문으로 두 글자 팰린드롬을 체크할 때, 문자열 길이만큼 도는데 i와 i+1을 비교해서 실수를 했다.
2. 32번째 줄에 pel[i]>pel[j-1]+1 이 조건에서 처음에 j가 0일때, pel[-1]을 들어가게 되서 런타임 실수가 났다.
n=" "+n;
이렇게 문자열에 시작에 공백을 줌으로써 에러를 해결할 수 있었다...
Code
#include <iostream>
#include <string>
using namespace std;
string n;
int pel[2501];
bool dp[2501][2501];
int main() {
cin>>n;
int len=n.size();
n=" "+n;
for(int i=1; i<=len; i++) {
dp[i][i]=true;
}
for(int i=1; i<len; i++) {
if(n[i]==n[i+1]){
dp[i][i+1]=true;
dp[i+1][i]=true;
}
}
for(int i=1; i<=len; i++) {
for(int j=1; j<len; j++) {
if(dp[i][j]==false && n[i]==n[j] && dp[i-1][j+1]){
dp[i][j]=true;
dp[j][i]=true;
}
}
}
for(int i=1; i<=len; i++) {
for(int j=1; j<=i; j++) {
if(dp[i][j]) {
//i서부터 j까지 펠린드롬임
if(pel[i]==0 || pel[i]>pel[j-1]+1){
pel[i]=pel[j-1]+1;
}
}
}
}
cout<<pel[len]<<endl;
}
Fealing
7번 틀린 문제다. 백준이 런타임에러를 런타임에러라고 알려주지 않았다..
처음부터 런타임에러를 내도록 짠 내 잘못이지..
index접근하는 for문을 짤 때, index-1 또는 index+1을 하게되면 forloop 횟수에 유의하며 코딩하자.
728x90
'Algorithm > 2019~2020' 카테고리의 다른 글
1912_연속합 (0) | 2021.04.22 |
---|---|
11055_가장 큰 증가 부분 수열 (0) | 2021.04.22 |
9465_스티커 (0) | 2021.04.22 |
2193_이친수 (0) | 2021.04.22 |
10942_팰린드롬? (0) | 2021.04.22 |
Comments