오늘의 학습 키워드
</> 탐욕법
공부한 내용 본인의 언어로 정리하기
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 기반 솔루션이 더 적합할 수 있습니다.
내일 공부할 것 :
아스키코드는 생각 못해봤는데 다시 보면서 이해를 해봐야겠다.
문제