Codewars 문제풀기 (03/08)

Who likes it?

  • 문자열 배열을 인자로 받는다.
  • 배열크기가 0 -> “no one likes this”
  • 배열크기가 1 -> “이름 likes this”
  • 배열크기가 2 -> “이름1 and 이름2 like this”
  • 배열크기가 3 -> “이름1, 이름2 and 이름3 like this”
  • 배열크기가 4이상 -> “이름1, 이름2 and 배열크기-2 others like this”

1. Test를 만들었다

  • 배열 크기가 0일때

    “no one likes this”출력

    public static String whoLikesIt(Stirng... names) {
        return (names.length==0) ? "no one likes this" : "";
    }
    
  • 배열 크기가 1일 때

    names[0] likes this 출력

    public static String whoLikesIt(Stirng... names) {
        if(names.length == 0) {
            return "no one likes this";
        } else if(names.length == 1) {
            return names[0] + " likes this";
        }
        return "";
    }
    
  • 배열 크기가 2 일 때

    names[0] and names[1] like this 출력

    public static String whoLikesIt(Stirng... names) {
        if(names.length == 0) {
            return "no one likes this";
        } else if(names.length == 1) {
            return names[0] + " likes this";
        } else if(names.length == 2) {
            return names[0] + " and" + names[1] " like this";
        }
        return "";
    }
    
  • 배열 크기가 3일 때

    names[0], names[1] and names[2] like this 출력

    public static String whoLikesIt(Stirng... names) {
        if(names.length == 0) {
            return "no one likes this";
        } else if(names.length == 1) {
            return names[0] + " likes this";
        } else if(names.length == 2) {
            return names[0] + " and " + names[1] " like this";
        } else if(names.length == 3) {
            return names[0] + ", " + names[1] + " and " names[2] + " like this";
        }
        return "";
    }
    
  • 배열 크기가 4이상 일 때

    names[0], names[1] and names.length-2 others like this 출력

    public static String whoLikesIt(Stirng... names) {
        if(names.length == 0) {
            return "no one likes this";
        } else if(names.length == 1) {
            return names[0] + " likes this";
        } else if(names.length == 2) {
            return names[0] + " and " + names[1] " like this";
        } else if(names.length == 3) {
            return names[0] + ", " + names[1] + " and " names[2] + " like this";
        }
        return names[0] + ", " + names[1] + " and " + (names.length-2) + " others like this";
    }
    
    • Success

2. 리팩토링 시작

switch랑 StringBuilder사용, 사실 연산이 많은편이 아니라 String을 써도 되지만 습관들일겸 사용

public static String whoLikesIt(String... names) {
    StringBuilder result = new StringBuilder();
    switch (names.length) {
      case 0:
        result.append("no one likes this");
        break;
      case 1:
        result.append(names[0]).append(" likes this");
        break;
      case 2:
        result.append(names[0]).append(" and ").append(names[1]).append(" like this");
        break;
      case 3:
        result.append(names[0]).append(", ").append(names[1]).append(" and ").append(names[2])
            .append(" like this");
        break;
      default:
        result.append(names[0]).append(", ").append(names[1]).append(" and ")
            .append(names.length - 2).append(" others like this");
        break;
    }
    return result.toString();
  }

3. 답 비교, 느낀점

Best Practice 가장 많이 받은 코드

public static String whoLikesIt(String... names) {
        switch (names.length) {
          case 0: return "no one likes this";
          case 1: return String.format("%s likes this", names[0]);
          case 2: return String.format("%s and %s like this", names[0], names[1]);
          case 3: return String.format("%s, %s and %s like this", names[0], names[1], names[2]);
          default: return String.format("%s, %s and %d others like this", names[0], names[1], names.length - 2);
        }
}
  • String.format을 사용하는게 더 보기 깔끔하다.

4. 궁금한거 공부

  • 문제를 보니 파라미터가 String…으로 되어있었다. 처음보는거라 검색해보니 가변인자라고한다.
  • 가변인자(variable argument)
    • 자바5부터 매개변수의 개수를 가변인자를 이용해서 동적으로 지정해줄 수 있다.
    • 키워드 : … (매개변수에서만 사용가능하고 변수선언때는 error가 나온다)
    • 가변인자는 내부적으로 배열을 생성하여 사용된다.
    • 가변인자 외 다른 매개변수가 있다면 가변인자는 마지막에 선언해야한다.
void sum(String s, String... str) {
    
}
void sum(String... str) {
    
}
  • 이런경우 컴파일러가 어떤 메소드를 사용해야하는지 구분을 못하여 error가 난다.
  • 따라서 가변인자를 사용한 메소드 오버로딩은 가급적 사용하지 않는것이 좋다.

댓글남기기