Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Is IPv4 Address
이것은 ipv4 의 주소값이 맞나요?
문제를 보면, ip 주소 값에 대한 문제이다.
IPv4 는 아이피 주소의 방식인데, 그 값의 타당한지 분석해주는 것이다.
https://ko.wikipedia.org/wiki/IPv4
뭐 대충 .. 그렇다 치고 각 주소 클래스가 있는데, 그 범위가 아래와 같다.
머리가 아프지만,, 일단 이것을 해결하려면 정규식이 필요하다.
답안 코드를 보면,
boolean isIPv4Address(String inputString) {
if (inputString == null || inputString.isEmpty()) {
System.out.println("ip가 아에 없거나 비어있습니다.");
return false;
}
inputString = inputString.trim();
if ((inputString.length() < 6) || (inputString.length() > 15)) {
System.out.println("ip의 자릿수가 불정확합니다.");
return false;
}
try {
Pattern pattern = Pattern.compile
("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.)"
+"{3}"+
"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
Matcher matching = pattern.matcher(inputString);
if(matching.matches() == true){System.out.println("패턴이 완벽합니다.");}
else{System.out.println("패턴이 안맞습니다.");}
return matching.matches();
} catch (PatternSyntaxException ex) {
System.out.println("패턴 싱크가 걸렸습니다.");
return false;
}
}
저기 중간에 극혐 부분이 보이시나요...
저기가 바로 정규식 부분입니다.
https://hamait.tistory.com/342
정규식에 대해 자세히 나온 사이트들을 알려드리겠습니다.
일단 익히고 가죠.
또한 패턴 ,, pattern compile 부분이 나오는데요.
이 또한 집고 넘어가야합니다.
https://developer88.tistory.com/90
이사이트를 참고하시구요.
즉 정규식과 패턴 을 활용해서 ip 주소의 타당성을 가려주는 겁니다.
복잡하긴 해도 어느정도 숙지가 되면, 사용하기 편하고 훨씬 코드가 간단해집니다.
if (inputString == null || inputString.isEmpty()) {
System.out.println("ip가 아에 없거나 비어있습니다.");
return false;
}
일단 첨 부분은 입력값이 null이거나 비어잇으면 false를 반환하도록 합니다.
inputString = inputString.trim();
다음은, 혹시모를 빈공간을 위해서 trim 을 통해 쫘악 당겨줍니다. 빈공간이 없게요.
if ((inputString.length() < 6) || (inputString.length() > 15)) {
System.out.println("ip의 자릿수가 불정확합니다.");
return false;
}
다음은 ip 자릿수를 체크 해줍니다. 6자리 미만이거나 15자리 초과시는 기준에 해당하지 않으므로 빼주고요.
이제 대망의 pattern / 정규식 조합이 나옵니다.
try {
Pattern pattern = Pattern.compile
("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.)"
+"{3}"+
"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
음 먼저 이부분..
일단은 패턴 객체를 선언해준뒤, compile을 시작합니다.
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ |
자 볼까요?
일단은 ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.)
^은 시작을 나타내고요. ?:는 집합의 대한 에외를 표현하고 있습니다.
아무튼 그렇게
25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]
250~255 범위를 나타내는 25[0-5]
200~249 범위를 나타내는 2[0-4][0-9]
000~199 범위를 나타내는 [01]?[0-9][0-9] 인데, 여기서 [01]? 는 있을수도 없을수도 있다는 것이다. 그리고
\\. 하여 .을 붙여준다.
{3}을 통해서 세번반복해준다.
다음은 뒤에 자리 (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
똑같이 뒤에 마지막 자리도 해주엇지만 왜 따로 쓴이유는 간단히도 .이 없기 때문임
암튼 보면 쉽지만 생각이 잘안나는 정규식을 마치고
Matcher matching = pattern.matcher(inputString);
매칭 메서드를 통해서 입력값을 분석해준다.
매칭 메서드는 true false 로 알려주기 때문에, 이를 통해 리턴값을 준다.
if(matching.matches() == true){System.out.println("패턴이 완벽합니다.");}
else{System.out.println("패턴이 안맞습니다.");}
나머지는 싱크 예외 부분이다. 생략을 하겠음.
단순히 정규식과 패턴 매치 메서드는 저 링크를 통해서 천천히 읽어보고
써보고 활용하는 것이 좋을 듯하다.
'Algorithm > Java' 카테고리의 다른 글
#22_Code Signal Arcade >> Avoid Obstacles (0) | 2019.11.25 |
---|---|
#20_Code Signal Arcade >> Array Maximal Adjacent Difference (0) | 2019.11.22 |
#19_Code Signal Arcade >> Are Equally Strong (0) | 2019.11.21 |