Count the smiley faces! CodeWars Kata

코딩 테스트를 준비해야 하는 이유는 실력을 키우기 위함도 있지만 실제 코딩 면접을 준비하는 데 반드시 필요하기 때문입니다. 코딩 테스트 문제들은 때로는 별 고민 없이 시간만 들이면 풀 수 있기도 하지만, 대부분은 푸는 방법을 알아야 효율적으로 접근이 가능합니다.

코딩 테스트 문제 중 일부는 접근 방법을 알고 있으면 금방 풀어낼 수 있지만 그렇지 않다면 단 시간 내에는 끝낼 수 없는 경우가 많습니다. 제한시간이 있는 코딩 면접에서 이런 문제를 만난다면 정말 멘붕이겠죠. 그래서 코딩 테스트 문제들을 많이 접해보고 문제 유형을 파악하는 것이 중요합니다.

Count the smiley faces!

사진: CodeWars

문제 바로가기

Given an array (arr) as an argument complete the function countSmileys that should return the total number of smiling faces.

Rules for a smiling face:

  • Each smiley face must contain a valid pair of eyes. Eyes can be marked as : or ;
  • A smiley face can have a nose but it does not have to. Valid characters for a nose are - or ~
  • Every smiling face must have a smiling mouth that should be marked with either ) or D

No additional characters are allowed except for those mentioned.

Valid smiley face examples: :) :D ;-D :~) Invalid smiley faces: ;( :> :} :]

countSmileys([':)', ';(', ';}', ':-D']);       // should return 2;
countSmileys([';D', ':-(', ':-)', ';~)']);     // should return 3;
countSmileys([';]', ':[', ';*', ':$', ';-D']); // should return 1;

In case of an empty array return 0. You will not be tested with invalid input (input will always be an array). Order of the face (eyes, nose, mouth) elements will always be the same.

 

입력값으로 주어지는 문자열 배열은 얼굴모양의 이모티콘 문자열을 담고 있습니다. 우리는 주어진 문자열이 정해진 룰에 맞는 웃는 얼굴 모양인지를 판별해서 배열 내 올바른 얼굴이 몇 개인지를 리턴해야 합니다.

  • 눈은 : or ;만 허용됩니다.
  • 코는 - or ~만 허용됩니다. 코는 있을 수도 있고, 없을 수도 있습니다.
  • 입은 ) or D만 허용됩니다.

친절하게도 눈, 코, 입을 의미하는 문자들은 항상 순서대로 입력됩니다. 빈 배열은 0을 리턴해야 합니다.

 

My Solution

한 줄짜리 코드가 완성되었습니다!

사실 꽤 쉬운 코드라서 그렇게 자랑할만한 일도 아니었습니다. 고무적인 것은 Best Practice가 제 코드와 거의 유사했다는 점입니다.

주어진 리스트를 Stream으로 만들고 필터링한 후에 갯수를 세면 끝나는 간단한 코드입니다. 필터링에는 정규식을 활용했습니다. 문자열이 특정 룰에 맞는지 검사하는 데는 정규식이 가장 간편하고도 쉬운 방법입니다.

제가 사용한 정규식을 살펴 보겠습니다.

[:;][-~]?[)D]

첫 번째로는 눈으로 쓸 수 있는 문자 중 하나가 오는지 체크하고요. 두 번째로는 코로 쓸 수 있는 문자가 오는지 체크합니다만 이건 있을 수도 없을 수도 있으므로 ?를 붙여줍니다. 그리고 마지막으로 입으로 쓸 수 있는 문자가 오는지 체크해주면 끝입니다.

솔루션 코드

테스트 코드

package com.codewars;

import java.util.List;
import java.util.regex.Pattern;

public class SmileFaces {
    public static int countSmileys(List<String> arr) {
        return (int) arr.stream().filter(item -> item.matches("[:;][-~]?[)D]")).count();
    }
}

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기