
오늘의 학습 키워드
</> 탐욕법
공부한 내용 본인의 언어로 정리하기
class Solution {
public int longestPalindrome(String s) {
String[] list = s.split("");
Map<String, Integer> countList = new HashMap<>();
int result = 0;
boolean odd = false;
for(int i = 0; i < list.length; i++){
countList.put(list[i], countList.getOrDefault(list[i], 0) + 1);
}
for(int p : countList.values()){
if(p % 2 == 0){
result += p;
} else {
result += p - 1;
odd = true;
}
}
if(odd){
result++;
}
return result;
}
}
오늘의 회고
오늘 문제는 주어진 문자열 s를 이용해 Palindrome 즉, 똑바로 읽으나 거꾸로 읽으나 똑같은 회문을 만들고 만들수 있는 문자열의 최대길이를 구해 반환하는 문제이다.
우선 문자열을 split()을 이용해 각각 문자로 나눠주었다
String[] list = s.split("");
그리고 문자의 개수를 세어주어야 했기 때문에 getOrDefault를 사용하기로 했고 그 값을 담아주기 위한 Map을 만들어주었다.
Map<String, Integer> countList = new HashMap<>();
그리고 만들어둔 문자 배열을 탐색하며 해당 값이 있으면 해당 문자가 있으면 저장 개수를 반환하고 거기 +1을 해주어 출현빈도를 완성해준다.
for(int i = 0; i < list.length; i++){
countList.put(list[i], countList.getOrDefault(list[i],0) + 1)
}
여기까지 완성 되었다면 조건에 맞춰서 회문을 만들어주면 된다.
내 조건은 짝수일 경우에는 해당 값의 출현빈도만큼 추가해주고 홀수일 경우 그 값의 -1, 그리고 홀수가 여러개일 경우에도 1개의 글자는 중앙으로 배치해 사용할 수 있으므로 홀수 값이 존재할 경우에 +1를 해주게 만들었다.
for(int p : countList.values()){
if(p % 2 == 0){
result += p;
} else {
result += p - 1;
odd = true;
}
}
if(odd){
result++;
}
이제 모두 완성되었으니 result를 반환해주도록 한다.
return result;
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
class Solution {
public int longestPalindrome(String s) {
int[] charCount = new int[128]; // ASCII 문자 수
int result = 0;
boolean hasOdd = false;
for (char c : s.toCharArray()) {
charCount[c]++;
}
for (int count : charCount) {
result += count / 2 * 2;
if (count % 2 == 1) {
hasOdd = true;
}
}
return hasOdd ? result + 1 : result;
}
}
현재 코드의 장점
현재 코드의 단점
시간 복잡도
두 버전 모두 시간 복잡도는 O(n)이지만, 개선된 버전이 상수 시간에서 더 효율적입니다. 또한, 개선된 버전은 공간 복잡도가 O(1)로, 원래 버전의 O(n)보다 우수합니다.
이 솔루션은 대부분의 경우에 더 효율적이지만, 유니코드 문자열을 처리해야 하는 경우에는 원래의 HashMap 기반 솔루션이 더 적합할 수 있습니다.
내일 공부할 것 :
아스키코드는 생각 못해봤는데 다시 보면서 이해를 해봐야겠다.
문제