알고리즘/codewars 22

codewars: Simple Encryption #3 - Turn The Bits Around

문제 링크입니다: https://www.codewars.com/kata/simple-encryption-number-3-turn-the-bits-around/train/cpp /*암호화를 위해 다음의 순서대로 64개의 허용된 문자가 있다.1. 모든 알파벳(오름차순으로 대문자, 소문자) -> 52개2. 모든 한자리수 숫자(오름차순) -> 10개3. " " 와 "." -> 2개 따라서 모든 문자는 6자리 비트로 표현 가능하다! 미리 체크해야할 사항1. 허용된 문자가 안나온다면 예외처리를 진행해야한다2. NULL이거나 빈 string이라면 그대로 반환해준다 암호화를 하기 위해서는 다음과 같은 규칙을 따른다1. 해당 문자의 5번째 비트와 다음 문자의 첫비트를 바꾼다(다음문자가 존재한다면)2. 2번째 비트와 4번..

codewars Factorial decomposition

문제 링크입니다: https://www.codewars.com/kata/factorial-decomposition/train/cpp완전탐색법을 통해 푼 문제였습니다.시간 단축을 위해 vector v를 선언하여 first에는 n 이하 자연수, second에는 지수가 저장되도록 하였습니다./* 주어진 N을 소인수 분해하시오 */ #include #include #include using namespace std; std::string decomp(int n) { //your code here string result; vector v(n + 1, make_pair(0, 0)); for (int i = 1; i

codewars Matrix Determinant

문제 링크입니다: https://www.codewars.com/kata/matrix-determinant/train/cpp역행렬 determinant를 구하는 문제였습니다.3*3 행렬 이후로도 determinant를 쉽게 구할 수 있다는 점이 놀라웠습니다.한가지 주의할 점은 다음과 같이 3*3 행렬이 주어졌을 때 #include #include using namespace std; long long recursive(vector m) { //기저 사례: 우리가 흔히 아는 공식 if (m.size() == 2) return (m[0][0] * m[1][1]) - (m[1][0] * m[0][1]); long long result = 0; int sign = 1; //결과와 부호 for (int i = 0;..

codewars: Count ones in a segment

문제 링크입니다: http://www.codewars.com/kata/count-ones-in-a-segment/train/cpp4 KYU 문제다보니 완전탐색법으로 문제를 풀 경우 시간초과가 발생합니다.따라서 이진수를 쭉 나열해보고 규칙을 찾아봤더니 비트를 사용하면 비교적 간단하게 풀 수 있는 문제였습니다!물론 규칙을 찾아내는데 엄청 오랜 시간이 걸렸습니다. /* left와 right라는 숫자가 주어졌을 때(1

codewars: Sum by Factors

문제 링크입니다: http://www.codewars.com/kata/54d496788776e49e6b00052f/train/cpp소인수분해를 할 때 주어진 숫자를 절대값을 취해주지 않아 헤맸던 문제였습니다. /*양수와 음수로 채워진 벡터가 있다.다음과 같은 양식으로 결과를 출력해야한다.(소수, 해당 소수로 나누어지는 숫자들의 합) ...*/#include #include #include #include #include #include using namespace std; class SumOfDivided{public: static std::string sumOfDivided(std::vector &lst);}; vector prime; //소수set used; //이미 포함된 소수인가? void get..

codewars: Path Finder #2: shortest path

문제 링크입니다: https://www.codewars.com/kata/path-finder-number-2-shortest-path/train/cpp /*당신은 N*N 크기의 미로에 0, 0 좌표에 있습니다.동, 서, 남, 북 이렇게 네가지 방향으로만 움직일 수 있다고 했을 때(N-1, N-1)까지 도달하는데 최소 걸음수를 구하시오*/#include #include #include #include #include using namespace std; int path_finder(string maze){ // TODO: Return the minimal number of steps required to reach the exit located at // (n - 1, n - 1) from the init..

codewars: Some Egyptian fractions

문제 링크입니다: https://www.codewars.com/kata/54f8693ea58bce689100065f/train/cpp이집트 분수는 일반 분수를 분자가 1인 분수들의 합으로 표현합니다.예를 들어 4/5=1/2+1/4+1/20으로 표현됩니다.상당히 흥미로운 주제인데도 불구하고 처음 접했기 때문에 개념이 상당히 어렵게 느껴졌는데 다행히 이에 대해 잘 설명된 포스팅이 있었기 때문에 프로그램을 쉽게 작성할 수 있었습니다.https://en.wikipedia.org/wiki/Egyptian_fraction denominator) //분자가 분모보다 큰 경우(대분수로 만듬) { result += to_string(numerator / denominator); numerator %= denominato..

codewars: Valid Braces

문제 링크입니다: http://www.codewars.com/kata/5277c8a221e209d3f6000b56/train/cpp왼쪽 괄호들을 스택에 넣고 오른쪽과 스택의 탑을 비교하는 것이 핵심이였습니다. /* 괄호, 중괄호, 대괄호를 문자열로 받고 맞는 순서로 입력받았는지 판별하시오 */ #include #include #include using namespace std; bool ifLeft(char ch) //왼쪽 괄호 여부 { if (ch == '(' || ch == '{' || ch == '[') return true; return false; } bool match(char left, char right) //왼쪽 괄호와 오른쪽 괄호 동일한지 비교 { if (left == '('&&righ..

codewars: Base -2

문제 링크입니다: https://www.codewars.com/kata/base-2그동안 2진수, 8진수, 16진수는 많이 접해봤지만 음수진수들은 처음 접하는 것 같습니다.나름 흥미로운 문제였습니다.Base -2/*음수이진법을 구현하시오*/#include #include using namespace std; class Negabinary {public: static std::string ToNegabinary(int i); static int ToInt(std::string s);}; int pow(int num){ if (num == 0) return 1; else if (num == 1) return -2; if (num % 2==1) return pow(num - 1) * (-2); int half..

codewars: RGB To Hex Conversion

문제 링크입니다: http://www.codewars.com/kata/513e08acc600c94f01000001/train/cpp16진수로 변환하는 간단한 문제였습니다. /*red, green, blue 값을 전달 받으면 16진수로 변환하여16진수 형태로 string을 반환하는 함수를 작성하시오*/#include #include #include using namespace std; class RGBToHex{public: static std::string rgb(int r, int g, int b);}; string number(int num){ switch (num / 10) { case 0: //1자리수라면 그대로 반환 return to_string(num); case 1: //두자리수라면 swit..