문제

water_melon함수는 정수 n을 매개변수로 입력받습니다. 길이가 n이고, 수박수박수…와 같은 패턴을 유지하는 문자열을 리턴하도록 함수를 완성하세요. 예를들어 n이 4이면 ‘수박수박’을 리턴하고 3이라면 ‘수박수’를 리턴하면 됩니다.

풀이 1

public class WaterMelon {
  public String watermelon(int n){
    StringBuilder sf = new StringBuilder();

    // Case 1
    for(int i=1; i<=n; ++i){
      if(i%2 != 0){
        sf.append("수");
      }else{
        sf.append("박");
      }
    }

    // Case 2
    for(int i=1; i<=n; ++i){
      sf.append(i%2 != 0 ? "수":"박");
    }

    return str.toString();
  }

  // 실행을 위한 테스트코드입니다.
  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));
  }
}

나름 쉬웠던 문제이다. (아직 레벨1이니 쉬울 수 밖에;) 문자열을 합쳐야하기 때문에 String 보다는 StringBuilder를 이용했고 int n의 값을 2로 나누어 홀, 짝수를 구분한다. 그리고 홀수면 “수”, 짝수면 “박”을 합쳐준다.

풀이 2

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));
  }
}

이 풀이는 처음에 봤을 때 뭔가 싶었다. 찾아보니 new String(new char[n/2+1])을 해주면 n-1만큼의 char배열이 생기고 그것을 String으로 new 연산해주면 배열 길이만큼의 null값이 생기게 되는 것 같다. (n/2+1말고 그냥 n-1해도 되는 것 같은데…) 아무튼 null은 char 자료형에선 ‘\0’과 같아서 replace를 뒤에 쳐주는 것이고 substring으로 맨 앞에서 부터 배열 길이-1 만큼 잘라주는 것이다.

3줄 이상의 코드가 1줄로 줄어버리니… 정말 저런걸 두고 잘 짰다고 하는 것 같다.