C#에서 주어진 문자열을 개별 문자가 아닌 단어 단위로 뒤집는 알고리즘을 살펴보겠습니다. 예를 들어 "This is my book"이라는 문장이 있다면, 결과는 "book my is This"가 되어야 합니다.
알고리즘 접근 방식
핵심 아이디어는 다음과 같습니다. 먼저 char 배열을 입력으로 받는 reverseWords 메서드를 생성하고, 공백 문자에 도달할 때까지 각 단어를 개별적으로 뒤집습니다. 그다음 마지막 단계에서 전체 문자열을 인덱스 0부터 n-1까지 한 번 더 뒤집습니다.
이 과정을 단계별로 보면 다음과 같습니다.
- 1단계: 문자열 "This is my book"의 각 단어를 뒤집으면 "koob ym si siht"가 됩니다.
- 2단계: 전체 문자열을 다시 뒤집으면 단어 순서가 반전되어 최종적으로 "book my is This"가 됩니다.
시간 복잡도 − O(N)
예제 코드
using System;
namespace ConsoleApplication{
public class Arrays{
static void reverse(char[] str, int start, int end){
char temp;
while (start <= end){
temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
public char[] reverseWords(char[] s){
int start = 0;
for (int end = 0; end < s.Length; end++){
if (s[end] == ' '){
reverse(s, start, end);
start = end + 1;
}
}
reverse(s, 0, s.Length - 1);
return s;
}
}
class Program{
static void Main(string[] args){
Arrays a = new Arrays();
string s = " This is my book ";
var res = a.reverseWords(s.ToCharArray());
Console.WriteLine(new String(res));
Console.ReadLine();
}
}
}코드 설명
reverse 헬퍼 메서드는 시작 인덱스와 끝 인덱스를 받아 두 포인터가 서로 만날 때까지 문자를 교환하며 해당 구간을 뒤집습니다. reverseWords 메서드는 문자열을 순회하면서 공백을 발견할 때마다 직전 단어 구간을 뒤집고, 모든 단어가 처리된 후 전체 문자열을 한 번 더 뒤집어 원하는 결과를 얻습니다.
출력 결과
book my is This