Codewars 문제풀기 (04/18)

Find Missing Letter

  • char 배열을 인자로 받는다.
  • char 배열은 연속된 문자열이며, 반드시 한 문자가 빠져있다. 그리고 대문자로 시작하면 대문자, 소문자로 시작하면 소문자이다.
  • 배열의 길이는 항상 2 이상이다
  • [“a”,”b”,”c”,”d”,”f”] 👉 “e”
  • [“O”,”Q”,”R”,”S”] 👉 “P”

1. Test와 리팩토링

  • 테스트 1 - 입력 배열이 [a, c]라면 b를 리턴한다.

    • 테스트 코드

      @Test
      @DisplayName("test should return 'b' when input is {a, c}")
      public void testShouldReturnBWhenInputIsAAndC() {
        // Given: Set array {a, c}
        char[] given = {'a', 'c'};
        // When: Call findMissingLetter method
        char actual = Kata.findMissingLetter(given);
        // Then: Should return 'b'
        assertEquals('b', actual);
      }
      
    • 실제 코드

      public class Kata {
          
        public static char findMissingLetter(char[] array) {
          return 'b';
        }
      }
          
      
    • 리팩토링 1 - 입력 배열 길이만큼 반복문을 돌며 비어있는 문자를 찾는다.

      public class Kata {
          
        public static char findMissingLetter(char[] array) {
          result = array[0];
          for(int i = 0; i<array[i]; i++) {
            if(result != array[i]) {
              break;
            }
            result++;
          }
          return result;
        }
      }
      
    • 리팩토링 2 - 향상된 for문 사용

      public class Kata {
          
        public static char findMissingLetter(char[] array) {
          result = array[0];
          for(char letter : array) {
            if(result != letter) {
              break;
            }
            result++;
          }
          return result;
        }
      }
      
  • 테스트 2 - 입력 배열이 [O, P, R, S, T, U]라면 Q를 리턴한다.

    • 테스트 코드

      @Test
      @DisplayName("test should return 'Q' when input is {O, P, R, S, T}")
      public void testShouldReturnEWhenInputIsAAndBAndCAndDAndF() {
        // Given: Set array {O, P, R, S, T}
        char[] given = {'O', 'P', 'R', 'S', 'T'};
        // When: Call findMissingLetter method
        char actual = Kata.findMissingLetter(given);
        // Then: Should return 'Q'
        assertEquals('Q', actual);
      }
      
    • 실제 코드 - 그대로

  • 제출 (약 10분)

2. 답 비교, 느낀점

Best Practice 가장 많이 받은 코드

public class Kata {
  public static char findMissingLetter(char[] array){
    char expectableLetter = array[0];
    for(char letter : array){
      if(letter != expectableLetter) break;
      expectableLetter++;
    }
    return expectableLetter;
  }
}
  • 완전 같은 방법으로 구현했다.

신박하다고 생각한 코드

public class Kata {
  public static char findMissingLetter(char[] array)
  {
    for (int i = 1; i < array.length ; i++){
      if(array[i] - array[i-1] != 1){
        return (char)(array[i-1]+1); 
      }
    }
    throw new IllegalArgumentException("Should not happen!");
  }
}
  • array[i] - array[i-1] != 1가 두 문자가 연속되지 않았다는 뜻이니까 그 사이의 문자를 리턴하면 되는구나

댓글남기기