[Java] 알고리즘, "수박수박수박수박수?"

수박수박수박수박수박수?

문제 설명

길이가 n이고, 수박수박수박수....와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 수박수박을 리턴하고 3이라면 수박수를 리턴하면 됩니다.


제한 조건

n은 길이 10,000이하인 자연수입니다.


입출력 예

 n

 return

 3

수박수

 4

수박수박 


나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
  public String solution(int n) {
      StringBuilder answer = new StringBuilder("");
      for(int i =1; i<=n; i++){
          if(i%2==0){
              answer.append("박");
          }else{
              answer.append("수");
          }
      }
      return answer.toString();
  }
}
cs

1을 n이 될때까지 증가시키는 for문을 돌리고 짝수일 때 "박", 홀수일 때 "수"를 계속 이어나가면 됩니다. 

** 여기서 중요한 점이 String answer =""; 를 선언하고 answer +="박"; 이런식으로 코딩을 해도 무방합니다. 하지만 속도를 더 높여 보다 빠른 연산을 위해서 StringBuilder를 사용했습니다. 

간단히 결론만 말하면, String 객체에 + 연산을 하는 것보다 StringBuilder 객체를 append하는 과정이 더 빠르다고 합니다. String 객체에 +하는 과정이 StringBuilder를 생성해서 append하는 과정을 포함하는 과정이므로 더 빠르다고 알고 있습니다. 자세한 내용은 나중에 따로 주제를 잡고 포스팅하도록 하겠습니다.


다른사람의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
public class WaterMelon {
    public String watermelon(int n){
 
        return new String(new char [n/2+1]).replace("\0""수박").substring(0,n);
    }
 
    // 실행을 위한 테스트코드입니다.
    public static void  main(String[] args){
        WaterMelon wm = new WaterMelon();
        System.out.println("n이 3인 경우: " + wm.watermelon(3));
        System.out.println("n이 4인 경우: " + wm.watermelon(4));
    }
}
cs


이 return문을 보고 바로 이해가 되지 않아서 봤었는데 그동안 사용하지 않았던 방식이 2가지나 있어서 공부하는데 도움이 되었던 답이었습니다. 

첫째, new String()의 생성자 키워드 안에 char배열을 집어넣으면 String 객체로 변환이 된다.

둘째, 빈 char배열이 생성이 되면 그 안에는 null이(null은 당연히 안되는 거지만) 아니라 '\0'으로 먼저 생성되어진다.


char 배열 생성하실때 n/2+1로 홀짝 경우의 수를 생각하신것 같은데, 자세히 연구하다보니 뒤의 substring이 어차피 n까지 짤라낼것이기 때문에 그냥 new char[n]으로 선언했어도 무방할 것 같습니다.^^ 오랜만에 좋은 공부한것 같습니다.

댓글

Designed by JB FACTORY