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 |
댓글