Goldman Sachs Interview Question: Level(Easy)
주어진 문자열을 역순시키는 프로그램을 작성하시오.
Built-in 메서드는 사용할 수 없으며, 문자열의 길이가 충분히 긴 경우에도 효율적인 시간에 수행되도록 작성하시오.
시간 복잡도를 계산하시오.
가장 먼저 떠오르는 아이디어는 문자열의 처음과 끝 문자를 각각 교환(swap)하는 방식으로 역순화하면 되겠다. 이 경우 문자열의 길이가 n이라면 n/2번의 반복이 필요하므로, O(n) 복잡도를 가진다. 비교적 쉬운 난이도의 문제다.
구현시 고려할 점은 Java에서 문자열 객체는 immutable이므로 StringBuffer나 char 배열로 변환하여 처리해야겠다.
public class ReverseStringTest {
public static String reverseString(String string) {
StringBuffer strBuffer = new StringBuffer(string);
for(int i=0; i<strBuffer.length()/2; i++) {
char tmpChar = strBuffer.charAt(i);
strBuffer.setCharAt(i, strBuffer.charAt(strBuffer.length()-i-1));
strBuffer.setCharAt(strBuffer.length()-i-1, tmpChar);
}
return strBuffer.toString();
}
public static String generateRandomString(int length) {
StringBuffer tmpStr = new StringBuffer();
for(int i=0; i<length; i++) {
tmpStr.append(generateRandomChar());
}
return tmpStr.toString();
}
private static char generateRandomChar() {
final String charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int index = new Random().nextInt(charSet.length());
return charSet.charAt(index);
}
public static void main(String[] args) {
System.out.println(reverseString("A"));
System.out.println(reverseString("AB"));
System.out.println(reverseString("ABA"));
System.out.println(reverseString("ACBC"));
String randomString = generateRandomString(1000);
System.out.println(randomString);
System.out.println(reverseString(randomString));
System.out.println("> done");
System.exit(0);
}
}
기타 구현 방법
A. 입력 문자열의 마지막 문자를 시작문자로 하는 새로운 문자열을 구성하는 방법이 있겠다. 아래 샘플코드는 StringBuffer 대신 char 배열을 이용했다.
public static String reverseString2(String string) {
char[] charArray = new char[string.length()];
for(int i=0; i<charArray.length; i++)
charArray[i] = string.charAt(string.length()-i-1);
return new String(charArray);
}
B. 재귀적인 방법으로 구현한다면 다음과 같이 할 수도 있겠다.
public static String reverseStringRec(String string) {
return reverseRec(new StringBuffer(string), 0, string.length()-1).toString();
}
//helper method
private static StringBuffer reverseRec(StringBuffer sb, int left, int right) {
if( Math.abs(left-right) < 2 ) {
return sb;
} else {
char tmpChar = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, tmpChar);
return reverseRec(sb, left+1, right-1);
}
}
C. 마지막으로 StringBuffer 클래스의 reverse() 메서드를 활용하는 방법이다.
public static String reverseStringAPI(String string) {
return new StringBuffer(string).reverse().toString();
}
[참고문헌]
1. Programming Interview Questions: CareerCup.com
0 댓글