반응형

CodeMaster has just returned from shopping. He scanned the check of the items he bought and gave the resulting string to Ratiorg to figure out the total number of purchased items. Since Ratiorg is a bot he is definitely going to automate it, so he needs a program that sums up all the numbers which appear in the given input.

Help Ratiorg by writing a function that returns the sum of numbers that appear in the given inputString.


Example


For inputString = "2 apples, 12 oranges", the output should be

sumUpNumbers(inputString) = 14.


code>>


int sumUpNumbers(std::string inputString) {

std::regex re("([0-9]+)");

std::smatch m;

int sum = 0;

while (std::regex_search(inputString, m, re))

{

sum += std::atoi(m[0].str().c_str());

inputString = m.suffix();

}

return sum;

}



반응형

'알고리즘 > codefights' 카테고리의 다른 글

56>digitsProduct  (0) 2018.04.12
55>differentSquares  (0) 2018.03.28
53>validTime  (0) 2018.02.10
52>longestWord  (0) 2018.02.04
51>deleteDigit  (0) 2018.02.01
반응형

Define a word as a sequence of consecutive English letters. Find the longest word from the given string.


Example


For text = "Ready, steady, go!", the output should be

longestWord(text) = "steady".



code>>


std::string longestWord(std::string text) {

std::regex reg("\\w+([a-zA-Z])");

std::smatch m;

std::string str="";

std::string temp = text;

while (std::regex_search(temp, m, reg))

{

for (auto t : m)

{

if (str.length() < t.length())

str = t;

}

temp  = m.suffix();

}

return str;

}




반응형

'알고리즘 > codefights' 카테고리의 다른 글

54>sumUpNumbers  (0) 2018.03.14
53>validTime  (0) 2018.02.10
51>deleteDigit  (0) 2018.02.01
50>chessKnight  (0) 2017.11.04
49>lineEncoding  (0) 2017.11.04
반응형

Given a string, output its longest prefix which contains only digits.


Example


For inputString="123aa1", the output should be

longestDigitsPrefix(inputString) = "123".


code>>


std::string longestDigitsPrefix(std::string inputString) {

std::regex reg("^[0-9]+");

std::smatch m;


std::regex_search(inputString, m, reg);

return m.str();

}


regex_match 문자열 전체가 정확히 참

regex_search 문자열 중 있다면 참


다른 사람 풀이>>


std::string longestDigitsPrefix(std::string inputString) {

return inputString.substr(0, inputString.find_first_not_of("0123456789"));

}

반응형

'알고리즘 > codefights' 카테고리의 다른 글

42>bishopAndPawn  (0) 2017.08.10
41>digitDegree  (0) 2017.08.08
39>knapsackLight  (0) 2017.08.08
38>growingPlant  (0) 2017.08.07
37>arrayMaxConsecutiveSum  (0) 2017.08.07
반응형

Correct variable names consist only of Latin letters, digits and underscores and they can't start with a digit.


Check if the given string is a correct variable name.


Example


For name = "var_1__Int", the output should be

variableName(name) = true;

For name = "qq-q", the output should be

variableName(name) = false;

For name = "2w2", the output should be

variableName(name) = false.


code>>


bool variableName(std::string name) {

std::regex r("^[a-z|A-Z|_.][a-zA-Z_0-9]*");

return regex_match(name, r);

}

반응형

'알고리즘 > codefights' 카테고리의 다른 글

29>chessBoardCellColor  (0) 2017.07.06
28>alphabeticShift  (0) 2017.07.06
26>evenDigitsOnly  (0) 2017.07.06
25>arrayReplace  (0) 2017.07.06
24>minesweeper  (0) 2017.07.06
반응형

https://msdn.microsoft.com/ko-kr/library/cc295435.aspx


정규식 테스트 사이트


http://regexr.com/



정규식 구문

구문

설명

.

임의의 한 문자 - 출력 여부에 관계없이 모든 단일 문자와 일치하는 와일드카드 역할을 합니다. 단, 줄 바꿈(\n) 문자는 제외됩니다.

예를 들어 정규식 c.t는 문자열 cat, c t, cot와 일치하지만 cost와는 일치하지 않습니다. 이 예에서 마침표(.)는 단일 문자를 나타내는 와일드카드입니다. 문자 'c'와 't' 사이에 마침표가 있으므로 문자 'c'와 't' 사이에 단일 문자(공백 포함)가 있는 문자열은 모두 이 식과 일치합니다.

*

최대(0개 이상) - 가능한 많은 수의 문자와 일치하면서 식 앞의 문자를 0번 이상 반복합니다.

정규식 .*는 한 문자를 0번 이상 반복합니다.

예를 들어 정규식 b.*k는 book, back, black, blank 및 buck와 일치합니다. 이 예에서는 마침표(.)가 별표(*)와 조합되어 하나의 구문이 됩니다. 마침표(.)는 별표(*) 식 바로 앞에 옵니다. 별표(*)는 'b'와 'k' 사이에 임의의 문자가 0번 이상 있을 수 있음을 의미합니다. 마침표(.)는 'b'와 'k' 사이의 문자에 대한 와일드카드 역할을 합니다. 이 예에서는 'b'와 'k' 사이에 임의의 문자가 반복될 수 있음을 의미합니다.

+

최대(1개 이상) - 가능한 많은 수의 문자와 일치하면서 식 앞의 문자를 1번 이상 반복합니다.

정규식 .+는 한 문자를 1번 이상 반복합니다.

예를 들어 정규식 bo+.는 bob, book 및 boot와 일치합니다. 이 예에서는 마침표(.)가 더하기 기호(+)와 조합되어 하나의 구문이 됩니다. 마침표(.)는 더하기 기호(+) 식 바로 뒤에 옵니다. 더하기 기호(+)는 문자 'o'가 1번 이상 있을 수 있음을 의미합니다. 마침표(.)는 각 단어의 마지막 문자(이 예에서는 'b', 'k' 및 't')에 대한 와일드카드 역할을 합니다.

@

최소(0개 이상) - 가능한 적은 수의 문자와 일치하면서 식 앞의 문자를 0번 이상 반복합니다.

정규식 .@는 한 문자를 0번 이상 반복합니다.

예를 들어 정규식 a.@x는 'abxbxb' 내의 'abx'와 'acxcxc' 내의 'acx'와 일치합니다. 이 예에서는 마침표(.)가 @ 기호와 조합되어 하나의 구문이 됩니다. 마침표(.)는 @ 기호 식 바로 앞에 옵니다. @ 기호는 'a'와 'x' 사이에 임의의 문자가 0번 이상 있을 수 있음을 의미합니다. 이 예에서 마침표(.)는 문자 'a'와 'x' 사이의 문자 'b' 및 'c'에 대한 와일드카드 역할을 합니다.

#

최소(1개 이상) - 가능한 적은 수의 문자와 일치하면서 식 앞의 문자를 1번 이상 반복합니다.

예를 들어 정규식 si.#er는 'sicker' 또는 'silkier'와 일치합니다. 이 예에서는 마침표(.)가 # 기호와 조합되어 하나의 구문이 됩니다. 마침표(.)는 # 기호 식 바로 앞에 옵니다. # 기호는 'si'와 'er' 사이에 임의의 문자가 0번 이상 있을 수 있음을 의미합니다. 마침표(.)는 단어 sicker에 있는 문자 'c' 및 'k'와 단어 silkier에 있는 문자 'l', 'k' 및 'i'에 대한 와일드카드 역할을 합니다.

[ ]

문자 집합 - 대괄호([]) 안에 지정된 임의의 한 문자입니다. [a-z]과 같이 하이픈(-)을 사용하여 문자 범위를 지정할 수 있습니다.

예를 들면 다음과 같습니다.

  • 정규식 c[aou]t는 cat, cot 및 cut와 일치하지만 cet나 cit와는 일치하지 않습니다.

  • 정규식 [0-9]는 임의의 숫자를 의미합니다. 복수 범위의 문자도 지정할 수 있습니다.

  • 정규식 [A-Za-z]는 모든 대소문자와 일치합니다.

^

줄의 시작 - 줄의 시작 위치에 지정된 텍스트가 나올 경우입니다.

예를 들어 정규식 ^When in은 "When in the course of human events"나 "When in town, call me"와 같이 "When in"으로 시작하면서 "When in"이 줄의 시작 위치에 나오는 모든 문자열을 검색합니다. 그러나 이 정규식은 줄의 시작에 나오는 "What and when in the course of human events"와는 일치하지 않습니다.

$

줄의 끝 - 줄의 끝 위치에 지정된 텍스트가 나올 경우입니다.

예를 들어 정규식 professional$는 문자열 "He is a professional"의 끝 부분과 일치하지만 문자열 "They are a group of professionals"와는 일치하지 않습니다.

^^

파일의 시작 - 파일의 시작 위치에 지정된 텍스트가 나올 경우입니다. 소스 코드 또는 텍스트 파일에서 텍스트를 검색할 때만 사용할 수 있습니다.

예를 들어 파일의 시작 위치에 나오는 첫 번째 HTML 태그를 검색하려면 정규식 ^^를 사용합니다.

$$

파일의 끝 - 파일의 끝 위치에 지정된 텍스트가 나올 경우입니다. 소스 코드 또는 텍스트 파일에서 텍스트를 검색할 때만 사용할 수 있습니다.

예를 들어 파일의 끝에 나오는 마지막 HTML 태그(태그 다음에 공백이 없는 경우)를 검색하려면 정규식 $$를 사용합니다.

|

또는 - 두 항목 사이의 선택을 나타냅니다. 즉, OR 기호(|)의 앞이나 뒤에 나오는 식과 일치합니다.

예를 들어 정규식 (him|her)는 "it belongs to him" 또는 "it belongs to her"와 일치하지만 "it belongs to them" 줄과는 일치하지 않습니다.

\

이스케이프 특수 문자 - 백슬래시(\) 다음에 나오는 문자입니다. 왼쪽 중괄호({), 캐럿(^) 또는 그 밖의 일부 특수 문자처럼 정규식 구문에 사용되는 문자를 찾는 데 사용할 수 있습니다.

예를 들어 \$를 사용하면 '줄의 끝'을 나타내는 정규식을 구현하는 것이 아니라 달러 기호($) 자체를 검색하게 됩니다. 마찬가지로 정규식 \.를 사용하면 마침표(.)가 정규식으로 사용될 때처럼 임의의 한 문자를 검색하는 것이 아니라 마침표(.) 문자 자체를 검색하게 됩니다.

{}

태그가 지정된 식 - 괄호 안에 포함된 식과 일치하는 텍스트에 태그를 지정합니다. \N을 사용하면 찾기 식에서 태그가 지정된 텍스트의 다른 항목을 검색하거나 바꾸기 식에서 태그가 지정된 텍스트를 삽입할 수 있습니다.

예를 들어 연속된 두 개의 중복 단어를 검색하려면 {.#} \1 식을 사용합니다.

연속된 단어가 공백 하나로 구분된다고 가정하면 오른쪽 중괄호(})와 백슬래시(\) 사이에 공백을 추가할 수 있습니다.

이 예에서는 # 기호와 마침표(.)가 중괄호({})와 조합되어 하나의 구문이 됩니다. 이 식에서 .#는 임의의 연속 문자를 나타냅니다. 식에서 이 부분은 중괄호({})로 묶여 있으므로 해당 연속 문자에는 태그가 지정되며 이를 \1로 나타낼 수 있습니다. 이 식은 연속 문자 다음에 공백이 오고 그 다음에 정확히 동일한 연속 문자가 또 나오는 경우를 찾습니다.

\N

N번째 태그가 지정된 식 - 찾기 식에서 \N은 N번째 태그가 지정된 식과 일치하는 텍스트를 나타냅니다. 여기에서 N은 1부터 9까지의 숫자입니다.

바꾸기 식에서 \N은 N번째 태그가 지정된 식과 일치하는 텍스트를 삽입합니다. 여기에서 N은 1부터 9까지의 숫자입니다. \0은 전체 찾기 식과 일치하는 텍스트를 삽입합니다.

예를 들어 연속된 두 개의 중복 단어를 찾아 한 단어로 바꾸려면 {.#} \l 식을 사용합니다.

연속된 단어가 공백 하나로 구분된다고 가정하면 오른쪽 중괄호(})와 백슬래시(\) 사이에 공백을 추가할 수 있습니다. 이 예에서는 # 기호와 마침표(.)가 중괄호({})와 조합되어 하나의 구문이 됩니다.

바꿀 때는 \l 식을 사용합니다.

\1은 찾기 문자열의 첫 번째 중괄호 쌍에서 찾은 내용을 나타냅니다. 바꾸기 작업에서 \1을 사용하면 연속된 중복 단어를 해당 단일 단어로 바꿀 수 있습니다.

( )

그룹 식 - 하위 식의 시작과 끝을 표시합니다.

하위 식은 (ha)+와 같이 괄호 ( ) 안에 포함되는 정규식입니다. 이 예에서는 더하기 기호(+)가 괄호 ( ) 그룹 식과 조합되어 하나의 구문이 됩니다. 괄호 ( ) 안에 들어 있는 (ha)가 하위 식입니다. 더하기 기호(+)를 추가하면 반복되는 문자 쌍을 찾을 수 있습니다. 더하기 기호(+)는 'ha'가 1번 이상 있을 수 있음을 의미합니다.

이 식은 'haha' 및 'hahaha'와 일치합니다.

~x

구분 안 함 - 식의 지정된 위치에 x가 나타날 경우 해당 항목을 검색에서 제외합니다.

예를 들어 정규식 real~(ity)는 "realty"와 "really"의 "real"은 구분하지만 "reality"의 "real"은 구분하지 않습니다.

\n

줄 바꿈 - 코드 보기의 새 줄 또는 디자인 보기의 <br>입니다.

이 구문(\n)을 사용하면 모든 줄 바꿈을 간단하게 나타낼 수 있습니다.

\t

탭 - 단일 탭 문자를 나타냅니다.

예를 들어 줄의 시작 위치에서 단일 탭이 지정된 문자를 모두 찾으려면 다음과 같은 정규식을 사용합니다.

^\t+

이 예에서는 캐럿(^)과 더하기 기호(+)가 탭(\t)과 조합되어 하나의 구문이 됩니다. 단일 탭 문자 식 앞에 오는 캐럿(^)은 탭이 지정된 모든 문자가 줄의 시작 위치에 있는 경우만 검색합니다. 더하기 기호(+)는 일치하는 하나 이상의 탭 문자를 나타냅니다.

[^]

집합에 없는 한 문자 - 캐럿(^) 뒤의 문자 집합에 없는 한 문자를 나타냅니다.

예를 들어 범위에 없는 문자를 제외한 임의의 문자를 나타내려면 여는 괄호 뒤에 첫 문자로 캐럿(^)을 사용합니다. [^269A-Z] 식은 2, 6, 9 및 모든 대문자를 제외한 모든 문자와 일치합니다.

n

반복 식 - 캐럿(^) 앞에 있는 식을 n번 반복합니다.

예를 들어 n이 4인 식 [0-9]^4는 네 자리 수를 모두 검색합니다. 실제로도 이 예와 같이 문자 집합([ ]) 구문과 반복(^n) 구문을 조합하여 많이 사용하고 있습니다.

:a

영숫자 - [a-zA-Z0-9] 식과 일치합니다.

[a-zA-Z0-9] 식을 사용하여 하나의 대소문자 또는 숫자 항목을 검색할 수 있습니다. 영숫자 항목이라고도 합니다. [a-zA-Z0-9]의 모든 인스턴스에 줄임 식 :a를 사용할 수 있습니다.

:b

공백 - 코드 또는 텍스트의 공백입니다.

예를 들어 줄의 시작 위치에서 단일 공백 문자를 검색하려면 정규식 ^:b를 사용합니다.

:c

영문자 - [a-zA-Z] 식과 일치합니다. 이 식을 사용하여 모든 대소문자를 나타낼 수 있습니다.

[a-zA-Z]의 모든 인스턴스에 줄임 식 :c를 사용할 수 있습니다.

:d

10진수 - [0-9] 식과 일치합니다. 이 식을 사용하여 모든 숫자를 나타낼 수 있습니다.

예를 들어 텍스트 파일에서 주민 등록 번호를 찾으려는 경우 주민 등록 번호 형식인 000000-0000000을 :d^6-:d^7로 나타내거나 [0-9]를 사용하여 동일한 식인 [0-9]^6-[0-9]^7로 나타낼 수 있습니다.

[0-9]의 모든 인스턴스에 줄임 식 :d를 사용할 수 있습니다.

:h

16진수 - [0-9a-fA-F]+ 식과 일치합니다.

'A'와 'F' 사이의 대소문자와 숫자를 사용한 16진수 조합을 나타내려면 이 식을 사용합니다.

예를 들어 웹 사이트 페이지에 서로 다른 여러 가지 배경색이 있고 해당 페이지의 색을 검정(예: 000000)으로 변경하려 하지만 기존 색의 16진수를 모르는 경우 기존 16진수를 모두 찾으려면 다음 정규식을 사용합니다.

\#:h

[0-9a-fA-F]를 사용하여 검색할 수도 있지만 이 예에서는 백슬래시(\)와 # 기호가 16진수(:h) 구문과 조합됩니다. \#는 식이 아닌 # 기호를 검색하며 :h는 모든 16진수 문자를 검색합니다.

기존 16진수를 바꾸려면 000000과 같이 원하는 배경색의 16진수를 입력합니다.

:i

식별자 - [a-zA-Z_$][a-zA-Z0-9_$]* 식과 일치합니다.

코드 작업을 할 때 모든 프로그램 식별자를 검색하려면 위의 긴 식을 입력하는 대신 줄임 식 :i를 사용할 수 있습니다.

:n

유리수 - ([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)|([0-9]+) 식과 일치합니다.

소수점을 포함하는 정수를 모두 검색하려면 위의 긴 식을 입력하는 대신 줄임 식 :n을 사용할 수 있습니다.

:q

따옴표 붙은 문자열 - ("[~"]*")|('[~']*') 식과 일치합니다.

인용 부호 안에 들어 있는 인용문을 모두 검색하려면 위의 긴 식을 입력하는 대신 줄임 식 :q를 사용할 수 있습니다.

:w

영문 문자열 - [a-zA-Z]+ 식과 일치합니다.

이 구문을 사용하면 대소문자에 관계없이 간단하게 영문자를 하나 이상 나타낼 수 있습니다.

:z

10진수 정수 - [0-9]+ 식과 일치합니다.

이 구문을 사용하면 0 이상의 숫자를 간단하게 나타낼 수 있습니다.


반응형

'개발관련 > ETC..' 카테고리의 다른 글

AWS CodeBuild, CodeDeploy  (0) 2019.07.25
객체 지향 설계의 원칙>SOLID  (0) 2019.05.08
javascript> Drag & Drop 파일 읽기  (0) 2018.12.05
C# ms referencesource 소스  (0) 2018.03.29
링크>웹 개발자가 되는 로드맵  (0) 2017.08.11
반응형

An IP address is a numerical label assigned to each device (e.g., computer, printer) participating in a computer network that uses the Internet Protocol for communication. There are two versions of the Internet protocol, and thus two versions of addresses. One of them is the IPv4 address.


IPv4 addresses are represented in dot-decimal notation, which consists of four decimal numbers, each ranging from 0 to 255, separated by dots, e.g., 172.16.254.1.


Given a string, find out if it satisfies the IPv4 address naming rules.


Example


For inputString = "172.16.254.1", the output should be

isIPv4Address(inputString) = true;


For inputString = "172.316.254.1", the output should be

isIPv4Address(inputString) = false.


316 is not in range [0, 255].


For inputString = ".254.255.0", the output should be

isIPv4Address(inputString) = false.


There is no first number.


code>>


bool isIPv4Address(std::string inputString) {


std::string tok;

std::stringstream ss(inputString);

int count = 0;

while (getline(ss, tok, '.'))

{

if (tok.size() == 0) return false;

for (int i = 0; i < tok.size(); i++)if (!isdigit(tok[i])) return false;

if (!(atoi(tok.c_str()) >= 0 && atoi(tok.c_str()) <= 255)) return false;

count++;

}

if (count != 4) return false;

    return true;

}


정규표현식 사용 한 것들 보니 놀랍다. ㅋㅋ


regex_match는 정규 표현식과 문자열이 정확하게 일치해야 참을 반환


다른 사람 풀이>>


bool isIPv4Address(std::string s) {

    regex r("[0-9]{1,3}(.[0-9]{1,3}){3}");

    if(!regex_match(s,r))return false;

    int a,b,c,d;

    sscanf(s.c_str(),"%d.%d.%d.%d", &a,&b,&c,&d);

    return a<256 && b<256 && c<256 && d<256;

}


bool isIPv4Address(std::string inputString) {
    regex r("^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4}$");
    smatch m;
    return regex_match(inputString, m, r);
}


반응형

'알고리즘 > codefights' 카테고리의 다른 글

23>boxBlur  (0) 2017.07.05
22>avoidObstacles  (0) 2017.07.05
20>arrayMaximalAdjacentDifference  (0) 2017.07.04
19>areEquallyStrong  (0) 2017.07.02
18>palindromeRearranging  (0) 2017.07.02

+ Recent posts