2023. 2. 6. 08:10ㆍ코딩테스트 해커랭크/Algorithms -Easy
문자열 s에서 문자열 t로 변환하고 싶으며 수정 규칙은 다음과 같다
1. 한번에 맨 끝의 문자를 지우거나, 맨 끝의 임의의 문자를 추가하는 것이 가능하다
2. 문자열이 하나도 없을때 지우는 행동은 아무결과 없음으로 처리된다
k번 만큼 문자열을 수정 할 때, s 문자열에서 t 문자열로 변환이 가능할지 확인 후 Yes, No를 return한다
string appendAndDelete(string s, string t, int k)
{
int same = 0;
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == t[i])
++same;
else
break;
}
int sDiff = (s.length() - same);
int tDiff = (t.length() - same);
int diff = sDiff + tDiff;
if (k >= diff && (k & 1) == (diff & 1))
return "Yes";
if (s.length() + t.length() <= k)
return "Yes";
return "No";
}
고려해야 할 상황이 굉장히 많은 문제고, 예외처리도 생각을 많이 해야 하는 문제다
첫번째로 s 문자열과 t 문자열이 시작부터 어디까지 같은지 체크해 same이라는 값으로 저장한다
이후 s의 길이에서 same을 뺀 값과 t의 길이에서 same을 뺀 값을 더해 s 문자열에서 t 문자열로 바꾸기 위해 몇번의 수정 작업을 해야하는지 구해 diff에 저장한다
만약 k의 값이 diff의 값과 같거나 크고, k와 diff가 짝수, 홀수 여부가 같다면 s문자열에서 k만큼 수정해서 t 문자열로 변경 할수 있으므로 Yes를 return 한다
k값이 diff보다 작다면 당연히 불가능하며, 또한 diff와 k의 홀 짝 여부가 맞지 않으면 자릿수를 동일하게 맞출 수 조차 없기 때문에 불가능하므로 두 조건을 만족해야한다
한가지 예외 사항이 있는데, 만약 s의 문자열 길이와 t의 문자열 길이를 합친 것보다 k의 크기가 크거나 같다면, 홀짝 여부와 관계 없이 s의 문자열 처음까지 싹 밀어버린 후 필요없는 횟수를 소모시켜버리고 t 문자열을 새로 써버리면 되기 때문에 이 경우에는 어떤 상황에 관계 없이 항상 Yes를 return 할 수 있다
만약 위 조건을 전부 만족하지 못한다면 변환이 불가능하므로 No를 return 한다
'코딩테스트 해커랭크 > Algorithms -Easy' 카테고리의 다른 글
| [HackerRank/C++] Library Fine (0) | 2023.02.07 |
|---|---|
| [HackerRank/C++] Sherlock and Squares (0) | 2023.02.07 |
| [HackerRank/C++] Find Digits (0) | 2023.02.06 |
| [HackerRank/C++] Jumping on the Clouds: Revisited (0) | 2023.02.06 |
| [HackerRank/C++] Sequence Equation (0) | 2023.02.06 |