728x90
반응형
나는 친구가 많지만 풀어본 문제이다.
처음 접근부터 틀렸던 문제. 처음에는 순서대로 문자열을 비교해준 다음에, 만약 틀린 부분이 하나라도 있다면 그 자리에서부터 다시 검사하는 코드였다.
코드에서 생기는 치명적인 문제를 발견했다...
문자열이 아닌 순간부터 그 다음을 다시 체크하니 있는 문자열도 체크하지 못하는 것...
코드는 이러했었다.
for (int i = 0; i < str.size(); i++)
{
if (sameCnt == target.size()) break;
if (str[i] == target[sameCnt])
sameCnt++;
else
sameCnt = 0;
}
그래서 안전하게 모든 문자를 첫 시작으로써 검사하기로 한다.
예를 들어...
input =>
ABAD
AD
1. A
- string[0] => A 통과
- string[1] => B 실패 (D와 같지 않음)
2. B
- string[0] => 실패 (A와 같지 않음)
3. A
- string[0] => A 통과
- string[1] => D 통과
모두 통과! break!
이렇게 돌아가는 로직이다. 코드는...
for (int i = 0; i < str.size(); i++)
{
for (int j = i; j < str.size(); j++)
{
// target은 0부터 시작하기 때문에 idx => j - i
if (str[j] == target[j - i])
{
if (++sameCnt == target.size())
{
break;
}
}
else break;
}
if (sameCnt == target.size()) break;
}
cout << (sameCnt == target.size());
좋은 문제였다.
로직을 짜기 전에 테스트케이스를 생각하고 짜야겠다는 기본 중에 기본을 다시 상기했다...
728x90
반응형
'알고리즘 문제풀이 > 문자열' 카테고리의 다른 글
[백준][C++] 17609 회문 (0) | 2022.11.04 |
---|---|
[백준][C++] 9342 염색체 (0) | 2022.11.04 |
[백준][C++] 4659. 비밀번호 발음하기 (0) | 2022.11.04 |
[백준][C++] 9046 복호화 (0) | 2022.11.04 |
[백준][C++] 3029 경고 (0) | 2022.11.04 |