본문 바로가기
Kotlin/Exercise

Pangram인지 판단하기

by 봄석 2019. 2. 23.

Pangram인지 판단하기



Pangram 이란?

팬그램 (그리스어παν γράμμα 판 그람마[*], '모든 글자'라는 뜻)은 알파벳의 모든 글자들을 사용해서 만든 문장을 뜻한다 - https://ko.wikipedia.org/wiki/%ED%8C%AC%EA%B7%B8%EB%9E%A8



kotlin test 코드를 통해서 Pangram인지 아닌지 판단해보자!



testcode

@Test
    fun emptySentence() {
        assertFalse(Pangram.isPangram(""))
    }
 
    @Test
    fun perfectLowercasePangram() {
        assertTrue(Pangram.isPangram("abcdefghijklmnopqrstuvwxyz"))
    }
 
 
    @Test
    fun lowercasePangram() {
        assertTrue(Pangram.isPangram("the quick brown fox jumps over the lazy dog"))
    }
 
 
    @Test
    fun missingCharacterX() {
        assertFalse(Pangram.isPangram("a quick movement of the enemy will jeopardize five gunboats"))
    }
 
 
    @Test
    fun anotherMissingCharacterX() {
        assertFalse(Pangram.isPangram("five boxing wizards jump quickly at it"))
    }
 
 
    @Test
    fun withUnderscores() {
        assertTrue(Pangram.isPangram("the_quick_brown_fox_jumps_over_the_lazy_dog"))
    }
 
 
    @Test
    fun withNumbers() {
        assertTrue(Pangram.isPangram("the 1 quick brown fox jumps over the 2 lazy dogs"))
    }
 
 
    @Test
    fun missingLettersReplacedByNumbers() {
        assertFalse(Pangram.isPangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"))
    }
 
    @Test
    fun mixedCaseAndPunctuation() {
        assertTrue(Pangram.isPangram("\"Five quacking Zephyrs jolt my wax bed.\""))
    }
 
 
    @Test
    fun mixedCaseDuplicatedCharacters() {
        assertFalse(Pangram.isPangram("the quick brown fox jumps over with lazy FX"))
    }
cs




"the quick brown fox jumps over the lazy dog"

같은 스트링을 입력해주고 그값이 Pangram인지 아닌지를 판단한다



1. 정규식으로 판단하기

 object Pangram {
        fun isPangram(input: String): Boolean {
            val regEx = "[a-z]"
            val pattern = Pattern.compile(regEx)
            val macher = pattern.matcher(input.toLowerCase())
 
            var matchCount = 0
            val atozGroup = mutableListOf<String>()
            while (macher.find()) {
                if (!atozGroup.contains(macher.group())) {
                    atozGroup.add(macher.group())
                    println("$matchCount : ${macher.group()}")
                    matchCount++
                }
            }
            return matchCount == 26
        }
    }
 



자바 정규식 기본정리 : Matcher, Pattern, find(), group()


정규식을 사용하면 문자열(String)이 특정 패턴과 일치하는지 여부를 확인하거나, 패턴에 맞는 값을 찾아내거나, 해당 값을 새로운 값으로 바꿀 수 있다.


matches 

 String target = "나는 2008년도에 입학했다.";
 String regEx = ".*\\d{1}.*";
 

 target.matches(regEx)  // target과 정규식이 일치하는지 안하는지 return



replaceAll

    String target = "나는 2008년도에 입학했다.";
    String regEx = "[0-9]";
    Pattern pat = Pattern.compile(regEx);
  
    Matcher m = pat.matcher(target);
    String result = m.replaceAll("2"); // 패턴과 일치할 경우 "2"로 변경
     
    System.out.println("출력 : " + result);
    // 출력 : 나는 2222년도에 입학했다.
 
 
 
 
 
 String target = "나는 2008년도에 입학했다.";
    String regEx = "[0-9]";

    System.out.println("출력 : " + target.replaceAll(regEx, "2"));




find, group

  String target = "나는 2008년도에 입학했다.";
    String regEx = "[0-9]";
 
    Pattern pat = Pattern.compile(regEx); 
    Matcher match = pat.matcher(target);
     
    int matchCount = 0;
    while (match.find()) {
        System.out.println(matchCount + " : " + match.group());
        matchCount++;
    }
    System.out.println("총 개수 : " + matchCount);
     
    // 0 : 2
    // 1 : 0
    // 2 : 0
    // 3 : 8
    // 총 개수 : 4





2. all을 이용한 범위검사방법

object Pangram {
    fun isPangram(s: String=
            ('a'..'z').all { it in s.toLowerCase() }
}


'a'..'z'로 범위를 선언한후 all함수를 써서 값을 판단한다

all 함수는 모든요소가 지정된 조건자와 일치하면 true를 반환합니다.

조건자는 {}안에 정의합니다

'Kotlin > Exercise' 카테고리의 다른 글

윤년 찾기  (4) 2019.03.03
Hamming -DNA 차이  (2) 2019.03.03
영어에서 돼지 라틴어로 번역하기  (2) 2019.02.24
Isogram인지아닌지 판단하기  (2) 2019.02.24
Raindrop - 숫자를 문자열로 변환하기  (2) 2019.02.23

댓글