[Lv.1] 옹알이(2)

작성일     업데이트:

카테고리:

태그:

내 풀이

크게 두 덩어리로 나눠 로직을 작성했다.

1. solution()

  • for문을 돌며 주어진 배열 안의 각 단어들을 split으로 쪼개서 또다른 배열에 넣어줌
  • 새로 생성된 배열을 check(따로 생성한 함수)로 검사
  • 각 검사 결과에 따라 answer에 숫자를 더함
  • answer 를 반환

2. check() (추가로 생성한 함수임)

  • 입력받은 배열을 검사하는 용도의 함수
  • for문으로 배열의 크기만큼 반복하며 switch문에 배열에서 꺼내온 문자를 대입
  • switch문에서 각 문자별로 뒷 문자들과 합치면 조카가 발음할 수 있는 단어가 되는지 체크 + 단어가 연속되는지 체크
  • 체크 결과에 따라 boolean 값 반환

[코드보기]

class Solution {
    public int solution(String[] babbling) {
      boolean bool;
      int answer = 0;

      for(String str : babbling) {
        String[] baba = str.split("");
        bool = check(baba);
        if(bool) {answer++;}
      }
      return answer;
    }

    public static boolean check(String[] list) {
      String[] say = { "aya", "ye", "woo", "ma" };
      boolean bool = false;
      String before = "1";
      int num =0;
      int size = list.length;

      for(int i =0; i < list.length; i++) {
        switch(list[i]) {
          case "a" :
            if(i < size-2) {
              String aya = list[i]+list[i+1]+list[i+2];
              if(aya.equals(say[0]) && !before.equals(say[0])) {
                num += 3;
                before = aya;
              }
            }
            break;

          case "y" :
            if(i < size-1) {
              String ye = list[i]+list[i+1];
              if(ye.equals(say[1]) && !before.equals(say[1])){
                num += 2;
                before = ye;
              }
            }
            break;

          case "w":
            if(i < size-2) {
              String woo = list[i]+list[i+1]+list[i+2];
              if(woo.equals(say[2])&& !before.equals(say[2])) {
                num += 3;
                before = woo;
              }
            }
            break;

          case "m" :
            if(i < size-1) {
              String ma = list[i]+list[i+1];
              if(ma.equals(say[3])&& !before.equals(say[3])) {
                num += 2;
                before = ma;
              }
            }
            break;
        }
      }

      if(size==num) {bool = true;}

      return bool;
	  }
}


다른 사람의 풀이

다른 풀이를 찾아보니 replaceAll()String.fomat()을 사용한 경우도 있었다.

[코드보기]

class Solution {
    public int solution(String[] babbling) {
        int count = 0;

        for (String babb : babbling) {
            if (isPronouncable(babb)) count++;
        }
        return count;
    }

    private boolean isPronouncable(String word) {
        final String[] words = {"aya", "ye", "woo", "ma"};

        for (String w : words) {
            word = word.replaceAll(String.format("%s(?!%s)", w, w), "-");
        }

        return word.replaceAll("-", "").isEmpty();
    }
}


replaceAll()은 대상 문자열을 원하는 문자 값으로 변환하는 함수인데 replace()와는 다르게 정규표현식을 인자로 넣을 수 있다는 것이 특징이다.
따라서 위 코드는 정규 표현식에 따라 값을 체크하여 바로바로 문자열 일부를 바꿔넣을 수 있게끔 되어있다.
그리고 그 정규 표현식을 위해 String.format()을 사용했는데
여기서 %s(?!%s)앞문자열(?!뒷문자열) 이런식으로 포맷 되며 이는 앞문자열 뒤에 뒷문자열이 오지 않는 경우에 진행시킨다는 뜻이다.

정규 표현식 관련 자료는 여기 참고 링크(클릭) 에서 확인 가능하다.

Programmers 카테고리 내 다른 글 보러가기

댓글남기기