문제 설명
단어 s의 가운데 글자를 반환하는 함수 solution을 만들어야 합니다. 단어의 길이가 짝수라면 가운데 두 글자를 반환하면 됩니다.
제한 사항
- s는 길이가 1 이상, 100 이하인 문자열입니다.
입출력 예
s | return |
---|---|
"abcde" | "c" |
"qwer" | "we" |
솔루션 1: substring 메소드 사용
첫 번째 접근 방식은 Java의 substring 메소드를 활용합니다.
public class Solution {
public String solution(String s) {
int length = s.length();
int middle = length / 2;
if (length % 2 == 0) {
// 짝수 길이일 경우 가운데 두 글자 반환
return s.substring(middle - 1, middle + 1);
} else {
// 홀수 길이일 경우 가운데 한 글자 반환
return s.substring(middle, middle + 1);
}
}
}

코드 설명:
- 문자열의 길이를 구합니다.
- 중간 인덱스를 계산합니다.
- 문자열 길이의 홀짝 여부에 따라:
- 짝수: 중간 두 글자를 반환합니다.
- 홀수: 중간 한 글자를 반환합니다.
솔루션 2: charAt 메소드 사용
두 번째 접근 방식은 Java의 charAt 메소드를 사용합니다.
class Solution {
public String solution(String s) {
return s.substring((s.length()-1) / 2, s.length()/2 + 1);
}
}
코드 설명:
이 솔루션은 매우 간결합니다. substring 메소드를 사용하여 한 줄로 문제를 해결합니다.
(s.length()-1) / 2
는 홀수 길이 문자열의 경우 정확히 중간 인덱스를, 짝수 길이 문자열의 경우 중간 왼쪽 인덱스를 가리킵니다.s.length()/2 + 1
은 항상 필요한 끝 인덱스를 제공합니다.
두 솔루션 비교
- 가독성: 첫 번째 솔루션이 더 명시적이고 이해하기 쉽습니다. 각 케이스(홀수/짝수)를 명확히 구분하여 처리합니다.
- 간결성: 두 번째 솔루션이 훨씬 더 간결합니다. 단 한 줄로 문제를 해결합니다.
- 유연성: 첫 번째 솔루션은 각 케이스를 별도로 처리하므로, 추가적인 로직을 넣기 쉽습니다. 두 번째 솔루션은 매우 특화되어 있어 수정이 어려울 수 있습니다.
- 성능: 두 솔루션 모두 O(1)의 시간 복잡도를 가지며, 실질적인 성능 차이는 무시할 만한 수준입니다.
시간 및 공간 복잡도
두 솔루션 모두:
- 시간 복잡도: O(1) - 문자열의 길이와 관계없이 일정한 시간이 소요됩니다.
- 공간 복잡도: O(1) - 추가적인 공간을 거의 사용하지 않습니다. (반환되는 문자열의 길이는 최대 2로 고정)
결론
이 문제는 문자열 처리의 기본을 다루는 좋은 예제입니다. 두 가지 다른 접근 방식을 통해 같은 문제를 해결할 수 있음을 보여줍니다. 첫 번째 솔루션은 명확성과 확장성에 중점을 두었고, 두 번째 솔루션은 간결성을 극대화했습니다. 실제 상황에서는 코드의 가독성, 유지보수성, 그리고 팀의 코딩 스타일 등을 고려하여 적절한 방식을 선택하면 됩니다.
알고리즘 문제 풀이를 통해 다양한 접근 방식을 고민하고, 각각의 장단점을 분석하는 것은 프로그래밍 능력 향상에 큰 도움이 됩니다. 계속해서 다양한 문제를 풀어보며 여러분의 스킬을 향상시켜 나가시기 바랍니다!
솔루션 3: StringBuilder와 조건부 로직 사용
세 번째 접근 방식은 StringBuilder를 사용하고 조건부 로직을 활용합니다.
public class Solution {
public String solution(String s) {
if(s.length() == 1) return s;
boolean isEven = s.length() % 2 == 0;
StringBuilder sb = new StringBuilder();
int mid = s.length() / 2;
if(isEven){
sb.append(s.charAt(mid-1));
}
sb.append(s.charAt(mid));
return sb.toString();
}
}

코드 설명:
- 문자열의 길이가 1인 경우를 먼저 처리합니다.
- 문자열 길이의 홀짝 여부를 확인합니다.
- StringBuilder를 사용하여 결과 문자열을 구성합니다.
- 중간 인덱스를 계산합니다.
- 짝수 길이일 경우, 중간 왼쪽 문자를 먼저 추가합니다.
- 모든 경우에 중간 문자(홀수의 경우 중간, 짝수의 경우 중간 오른쪽)를 추가합니다.
- 구성된 문자열을 반환합니다.
세 가지 솔루션 비교
- 가독성:
- 솔루션 1: 가장 명시적이고 이해하기 쉬움.
- 솔루션 2: 매우 간결하지만 로직 이해에 약간의 사고가 필요함.
- 솔루션 3: 중간 정도의 가독성. 조건부 로직이 명확함.
- 성능:
- 솔루션 1, 2: 단순 substring 연산으로 매우 효율적.
- 솔루션 3: StringBuilder 사용으로 약간의 오버헤드가 있을 수 있으나, 실제로는 무시할 만한 수준.
- 메모리 사용:
- 솔루션 1, 2: 추가 메모리 사용 없음.
- 솔루션 3: StringBuilder 객체 생성으로 약간의 추가 메모리 사용.
- 예외 처리:
- 솔루션 1, 2: 특별한 예외 처리 없음.
- 솔루션 3: 길이가 1인 문자열에 대한 명시적 처리.
- 확장성:
- 솔루션 1: 각 케이스를 명확히 구분하여 추가 로직 삽입 용이.
- 솔루션 2: 매우 특화되어 있어 수정이 어려울 수 있음.
- 솔루션 3: 조건부 로직을 통해 다양한 케이스 처리 가능.
시간 및 공간 복잡도
세 솔루션 모두:
- 시간 복잡도: O(1) - 문자열의 길이와 관계없이 일정한 시간이 소요됩니다.
- 공간 복잡도: O(1) - 솔루션 3의 경우 StringBuilder를 사용하지만, 결과 문자열의 길이가 최대 2로 고정되어 있어 실질적으로 상수 공간을 사용합니다.
결론
이 문제에 대한 세 가지 다른 접근 방식을 살펴보았습니다. 각 솔루션은 자신만의 장단점을 가지고 있습니다:
- 첫 번째 솔루션은 명확성과 직관성이 뛰어납니다.
- 두 번째 솔루션은 극도의 간결함을 보여줍니다.
- 새로 추가된 세 번째 솔루션은 StringBuilder를 사용하여 더 유연한 접근 방식을 제공합니다.
실제 개발 환경에서는 코드의 가독성, 팀의 코딩 스타일, 그리고 특정 요구 사항(예: 특별한 예외 처리 필요)에 따라 적절한 방식을 선택할 수 있습니다.
이러한 다양한 접근 방식을 비교 분석하는 것은 문제 해결 능력을 향상시키는 데 큰 도움이 됩니다. 각 방식의 장단점을 이해하고, 상황에 따라 최적의 솔루션을 선택할 수 있는 능력을 기르는 것이 중요합니다.
계속해서 다양한 알고리즘 문제를 풀어보며, 여러 가지 해결 방식을 고민하고 비교해 보세요. 이를 통해 더욱 유연하고 효율적인 코드를 작성할 수 있는 개발자로 성장할 수 있을 것입니다!