Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Is IPv4 Address
이것은 ipv4 의 주소값이 맞나요?
문제를 보면, ip 주소 값에 대한 문제이다.
IPv4 는 아이피 주소의 방식인데, 그 값의 타당한지 분석해주는 것이다.
https://ko.wikipedia.org/wiki/IPv4
IPv4 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. IPv4는 인터넷 프로토콜의 4번째 판이며, 전 세계적으로 사용된 첫 번째 인터넷 프로토콜이다. 과거에 인터넷에서 사용되는 유일한 프로토콜이였으나 오늘날에는 IPv6이 대중화되었다. IETF RFC 791(1981년 9월)에 기술되어 있다. IPv4는 패킷 교환 네트워크 상에서 데이터를 교환하기 위한 프로토콜이다. 데이터가 정확하게 전달될 것을 보장하지 않고, 중복된 패킷을 전달하거나 패킷의 순서를 잘못 전달할 가능성도
ko.wikipedia.org
뭐 대충 .. 그렇다 치고 각 주소 클래스가 있는데, 그 범위가 아래와 같다.
머리가 아프지만,, 일단 이것을 해결하려면 정규식이 필요하다.
답안 코드를 보면,
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
정규표현식 (Regex) 정리
정규표현식은 아주 가끔 쓰기때문에 항상 다시 볼때마다 헥깔리곤 하는데.. 주요 사용예를 정리하여 보았다. 나중에 찾아보기 편하라고~ 정규 표현식의 용어들 정규 표현식에서 사용되는 기호를 Meta문자라고 표..
hamait.tistory.com
정규식에 대해 자세히 나온 사이트들을 알려드리겠습니다.
일단 익히고 가죠.
또한 패턴 ,, pattern compile 부분이 나오는데요.
이 또한 집고 넘어가야합니다.
https://developer88.tistory.com/90
Matcher 클래스와 Pattern Class로 정규 표현식을 활용해보자
지난 글에서 정규 표현식(Regular Expression)에 대해서 정리해 보았었는데요. 오늘은 Matcher클래스와 Pattern 클래스를 이용해서, 정규 표현식을 활용해보는 것에 대해서 정리해 보도록 하겠습니다. 참고로, 정..
developer88.tistory.com
이사이트를 참고하시구요.
즉 정규식과 패턴 을 활용해서 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 |