문제

BFS문제로 인접한 배추들의 갯수를 그룹이 몇개있는지 체크하는 문제이다.  

풀이 : 내가 작성한 코드

public static void Main()
    {
            int length = int.Parse(Console.ReadLine());
            for (int i = 0; i < length; i++)
            {
                string[] str = Console.ReadLine().Split(' ');
                int x = int.Parse(str[0]);
                int y = int.Parse(str[1]);
                int count = int.Parse(str[2]);
                Queue<(int, int)> queue = new Queue<(int, int)>();

                int[,] arry = new int[x, y];
                int[,] vis = new int[x, y];

                for (int k = 0; k < count; k++)
                {
                    string[] strpos = Console.ReadLine().Split(' ');
                    arry[int.Parse(strpos[0]), int.Parse(strpos[1])] = 1;
                }

                int[] dx = new int[] { 1, 0, -1, 0 };
                int[] dy = new int[] { 0, 1, 0, -1 }; // 상하좌우 네 방향을 의미
                int nG = 0;
                for (int z = 0; z < x; z++)
                {
                    for (int v = 0; v < y; v++)
                    {
                        if (vis[z, v] == 1 || arry[z, v] == 0)
                        {
                            continue;
                        }

                        queue.Enqueue((z, v));
                        nG++;
                        while (queue.Count != 0)
                        {
                            var cur = queue.Dequeue();
                            int curx = cur.Item1;
                            int cury = cur.Item2;
                            //시작 확인

                            // 상하좌우 칸을 살펴볼 것이다.
                            for (int dir = 0; dir < 4; dir++)
                            {
                                int nx = cur.Item1 + dx[dir];
                                int ny = cur.Item2 + dy[dir]; // nx, ny에 dir에서 정한 방향의 인접한 칸의 좌표가 들어감
                                if (nx < 0 || nx >= x || ny < 0 || ny >= y)
                                    continue; // 범위 밖일 경우 넘어감
                                if (vis[nx, ny] == 1 || arry[nx, ny] != 1)
                                    continue; // 이미 방문한 칸이거나 배추칸이 아닐경우

                                vis[nx, ny] = 1; // (nx, ny)를 방문했다고 명시
                                queue.Enqueue((nx, ny));
                            }
                        }
                    }
                }
                Console.WriteLine(nG);
            }

              
    }

BFS문제에서는 칸의 어떤 상태(배추:1,빈공간:0)인지 체크하는 부분과 큐에 들어간 칸(배추 가 심어져있는)이 어디까지 방문할수 있는지, 이미 방문한 위치인지 체크한다.

이문제는 흰지렁이가 포함할수 있는 범위를 묻는 문제는 아니고 몇개의 범위를 폼할수 있는 문제이기 때문에 큐에 입력될때 마다 카운팅을 했다. 

 

 

문제

https://www.acmicpc.net/problem/1012

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

문제

https://www.acmicpc.net/problem/10808

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 작성하는 문제이다. 

풀이 : 내가 작성한 코드

 

 처음 생각했을 때는 입력된 string값을 기준으로 또 다른 a~z을 체크하여 입력된 string요소의 알파벳이 해당하는 수를 카운팅 해서 추 출력하려고 했다. 그러면 총 O(N^2) 시간 복잡도였다. 다른 방법으로는 미리 a~z의 해당하는 26개 크기를 가지는 배열을 미리 생성했다. 그렇게 하면 a~z까지 각각의  string요소의 해당하는 알파벳에 위치가 정해 지므로, 입력값의 요소로 for문을 돌리면서 해당하는 알파벳에 1씩 증가해 주면 된다. 

느낀 점

단순히 정답을 출력하는 풀이식보다는 좀 더 최적화여 값을 구하는 연습을 해야겠다. 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

문제

https://programmers.co.kr/learn/courses/30/lessons/42587

우선순위를 정하여 먼저 출력할 인쇄물의 대한 처리를 하는 문제이다. 

풀이 : 내가 작성한 코드

우선순위와 인덱스를 갖는 Task라는 클래스를 만들어서 Queue에 넣도록 했다.  그런 후 foreach로 하나씩 검사하여 자기보다 뒤 에이 있는 값이 우선순위가 높다면 반복문을 빠져나와 맨뒤로 넣도록 했다. 선입선출이기 때문에 큐를 사용했다. 모든 값들을 정렬할 필요가 없기 때문에 nNow인 순서를 체크하는 변수와 매개변수 location이 같으면 값을 출력해준다. 

풀이 : 다른 사람이 작성한 코드

나는 큐에 우선순위와 인덱스 값을 저장할 클래스를 따로 만들었지만 이 코드에서는 KeyValuePair를 사용했다. While문을 돌리면서 큐에 들어가 있는 값들 중에 가장 높은 우선순위의 값이 큐의 맨 처음에 입력된 값과 우선순위를 비교한다. 가장 큰 값이 현재 입력 순서라면 매개변수 location과 비교한다.  그 값이 location도 아닌데 가장 큰 값이면 answer를 하나씩 증가한다. 출력 순서가 아니란 얘기다. 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

문제

k값만큼 알파벳 순서인 뒤로 이동.

 

1. 대소문자 구별

2. 알파벳 외에 다른 문자는 변경하지 않는다.

3.'z' , 'Z'를 넘어가면 다시 'a', 'A' 순서로

풀이 : 내가 작성한 코드

            public static string caesarCipher(string s, int k)
            {
                string strAnswer = string.Empty;
                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] >= 'a' && s[i] <= 'z' )
                    {
                        int a = s[i] - (97 - k);
                        strAnswer += ((char)((a % 26) + 97));
    
                    }
                    else if(s[i] >= 'A' && s[i] <= 'Z')
                    {
                        int a = s[i] - (65 - k);
                        strAnswer += ((char)((a % 26) + 65));
                    }
                    else
                    {
                        strAnswer += s[i];
                    }
                }
                return strAnswer;
            }

고려할 부분은 대소문자 체크와 그 외 문자 체크 정도였다.  z이면 다시 a로 이동하도록 하는 부분을 어떻게 할지는 고민했었다. 알파벳 개수인 26을 % 연산을 통해서 체크했다.  

 

Caesar Cipher | HackerRank

Encrypt a string by rotating the alphabets by a fixed value in the string.

www.hackerrank.com

알고리즘 문제는 풀면 풀수록 자주 등장하거나 디테일한 값을 구하는 패턴이 있는 거 같다. 많이 풀어봐야겠다. 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘 문제풀이 

문제

최소공배수 : 두 개 이상의 자연수의 공통인 수 중 가장 작은 수
최대공약수 : 두 개 이상의 자연수의 공통인 약수중 가장 큰 수

 

 

 

내 풀이

큰수에서 작은수를 나눈 나머지가 0이 될때 까지 나누면 최소공배수가 된다.

최대 공약수 =  n x m / 최소공배수 공식을 통해 구함

 

작은수를 큰수에 대입, 나머지를 작은수에 대입하여 나머지가 0일 될때가지 나누고 0이 되는 그때의 작은수가 처음 제시된 두의 최대공약수가 된다. -> 유클리드 호제법

 

 

다른 사람 풀이

재귀함수로 b값이 0이 나올때까지 함수를 호출해줬다.  삼항연산자를 통해 조건문없이 원하는 답을 도출 할 수 있었다. 다른 문제를 풀때는 이런 접근방법도 생각해 봐야겠다.

 

 

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘 문제풀이 

문제

입력된 int [] 형식 배열중에 가장 작은 수를 구해서 제거해주는 과정이 고려해야 할 부분이다. 

 

 

내 풀이

list에 옮겨 담고 각 요소를 비교하며 가장 작은 수를 뺀 리스트를 배열로 변환하여 반환했다.

 

다른 사람 풀이

Linq를 사용하여 배열의 요소들 중 최솟값을 구하고  Where으로 조건을 두어, 아까 구한 최소값을 제외한 요소들로 배열로 만들었다. Linq가 사용은 간편하게 원하는 값을 받아 올 수 있다는 장점이 있지만 속도가 느리다는 점에서 유니티 개발에서는 적절히 사용?을 해야 할 듯싶다.

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘 문제풀이 

문제

고려해야 할 부분은 제곱근만 구하면 되는 문제이다.

 

내 풀이

Math.Sqrt()을 사용해서 입력된 n의 제곱근을 구했다. ath.Sqrt()의 반환 형식은  double형이라 long으로 캐스팅해줬다.

다른 사람 풀이는 접근방식이 같거나 참고할만한 코드가 없어서 이번 문제는 생략했다.

 

+알아두자

Math.Sqrt(Double) Method

지정된 숫자의 제곱근을 반환합니다.

Math.Pow(Double, Double) Method

정된 숫자의 지정된 거듭제곱을 반환합니다.

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘 문제풀이 

문제

long형태로 입력된 숫자를 int형 배열로 반환하는 문제이다.

내 풀이

n을 인덱스로 접근하기 위해 string형태로 변환하고 인덱스를 뒤에서 부터 참조하여 int[] answer에 담았다. 문자열을 인덱스로 접근하면 s[i]는 char형이기 때문에 string으로 바꾸고 다시 int.Parse로 int로 변경해줬다.

 

 

다른 사람 풀이

long형 변수를 2개 선언하여 n의 자릿수로 접근하여 넣어주는 방법이다. while문은 자릿수를 비교했을때 n값을 초과하면 탈출 하도록했다.  

 

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

입력된 문자열이 숫자로만 이루어져있는지 체크와 길이가 4또는 6인지 체크해야한다.

내 풀이

삼항연산자를 이용하고 int.TryParse()를 통해 숫자로 변환이 가능한지 체크한다. 

 

다른 사람 풀이

Regex.IsMatch라는  정규표현식을 이용하여 패턴을 검사하여 풀이한 방식

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘 문제풀이 

문제

입력된 배열의 요소 인덱스를 오름차순으로 정렬하는것은 어렵지 않지만 요소의 인덱스가 가리키는 문자가 중복인 경우가 고려야할 부분이다.  

 

//다른 사람풀이를 2문제를 분석함

다른 사람 풀이 _1

내가 풀려고 했던 접근은 입력된'n' 문자끼리 순서를 비교한 뒤 그 순서대로 정렬을 한다음에 중복된 'n'이 있으면 거기서 또 정렬을 하려고했는데, 이 코드를 보니까 그럴 필요가 없었다. 비교를 해야할 'n'을 맨 앞으로 빼고 그 다음에 정렬하면 된다.  

 

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

입력된 long형식을 자릿수 별로 내림차순으로 정렬하는 것이 고려해야 할 부분이다.

 

내 풀이

list를 써서 (배열로 해도 될 듯) int형으로 자릿수 하나하나를 Add 하고, 다시 이중 포문으로 내림차순으로 정렬한다.

 

다른 사람 풀이

String.ToCharArray()로 long형식을 Char배열로 입력하고 입력된 문자를 Sort로 오름차순으로 정렬한 뒤 Reverse로 뒤집는다.  To.CharArray로 

ToInt64(String)

숫자의 지정된 문자열 표현을 해당하는 64비트 부호 있는 정수로 변환합니다.

String.ToCharArray Method

이 인스턴스의 문자를 유니코드 문자 배열에 복사합니다.

 

반응형
 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

최소의 동전 갯수로  입력된 값을 만드는 문제이다.  가장  큰가치의 돈부터 접근하여 필요한 동전갯수를 증가시키는 방법이 좋을 듯 하다.

 

내 풀이

for문 안에 while문이 없으면 한번만 계산하고 다음 인덱스로 넘어가기 때문에 

(ex 입력된 값 4200원 , coin[i] = 1000 인경우

4200 / 1000 을 4번 해줘야함)

 

 

 

 

반응형

 

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

1. 기다리는 사람들의 총 최소시간을 구하기 위한 정렬

2. 각 사람당 몇분이 걸렸는지 계산

 

내 풀이

1. 오름차순으로 정렬하는 것이 가장 최소시간다.

2. 자신의 시간은 전 사람이 기달렸던 시간을 더해주면 기다리는 시간이 나온다.

내가 기다리는 시간 = 전 사람시간 + 내가 뽑는 시간 

 

 

 

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

입력된 문자열의 알파벳이 +n 했을 경우 'z', 'Z'을 초과했을 경우 다시 'a', 'A'부터 밀려난 값을 구하는 것이 포인트

ex) 알파벳 'y'이고 n 값이 '25'이면 'z'를 초과 하게된다.

 

내 풀이

맨 처음 if(temp == 32)는 공백인 경우의 아무 작업도 하지 않기 위해 넣었음  다른 방법이 있을 것 같은데;;

'a~z', 'A~Z'은 알파벳은 26개이며 입력된 값이 90을 넘을 경우(90('Z') , 122('z')) 다시 알파벳이 시작되는('a', 'A')부터 시작하기 위해 -26을 빼는 과정으로 해결했다. 

 

다른 사람 풀이

'z'와'Z'를 각각 int로 캐스팅한 값을 가지고, if가 공백이 아닌 경우를 체크하고 밑에서 char.IsUpper로 대, 소문자를 체크해주는데 이 과정이  굳이 없어도 될 것 같다. 마지막에는 answer +=을 해주는 게 아닌 string.fomat을 활용해서 채워주고 있다.

위 코드를 활용해서 조건문을 좀 줄여서 다시 작성해봤다.

느낀 점

확실히 같은 문제를 봐도 접근하는 방법이 다르다는 것을 느꼈다. 물론 이 문제 자체가 복잡하지 않아서 크게 벗어나지는 않지만 IsUpper를 이용해서 보이는 코드 길이를 줄일 수 있었다.

 

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

배열의 요소중 "Kim"가 몇번째 있는지 구하는 것이 포인트

 

내 풀이

주어진 string[]을 순회하면서 "Kim"을 찾도록했다.

 

다른 사람 풀이

Array.FindIndex()로 특정한 string값을 뽑는 함수를 이용했다.

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

입력된 divisor로 나누었을 때 나머지 값이 0인 element를 구하고 오름차순으로 정렬하는 것이 포인트

 

내 풀이

'%'를 이용해 0이 나오면 나누어 떨어지기 때문에 요소들을 간단히 구할 수 있었다.  

 

다른 사람 풀이

다른 점으로는 divisor이 1 경우  AddRange를 통해 입력받고 있다.

 

느낀 점

문제 자체가 워낙 간단한 문제이고, 리스트와 배열을 정렬하는 함수가 있기 때문에 쉽게 해결할 수 있었다. 

 

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

입력된 두 정수중 큰 수와 작은 수를 구하는 과정이 포인트

 

내 풀이

삼항 연산자로 max(큰 수), min(작은 수)를 구하고 for문으로 min이 시작 값 max가 끝 값으로 순회하면서 answer에 더하도록 했다.

 

다른 사람 풀이

큰, 작은 값을 구하지 않고 while문으로 a! = b라는 조건으로 a값을 기준으로

a가 크면 -1, 작으면 +1로 해주고 있다. 이 과정이 a부터 b사이에 값을 더해주는 과정이고 마지막 결괏값을 리턴할 때 b를 더해줌으로써 a와 b까지의 값을 모두 더한 값이 된다. 

 

느낀 점

내가 문제를 보고 포인트라고 생각했던 것은 a가 b 중 누가 더 큰 값인지, 작은 값인지 체크하는 것이었는데, 시작 값이나 끝 값을 미리 정하는 것이 아닌 반복문을 통해 기준으로 잡은 값이 큰 값이면 빼고 작은 값이면 더하는 방식으로 입력받은 두수 사이를 모두 더 할 수 있었다. a!=b인 조건인 두 수가 같을 때 반복문을 빠져나가는 조건은 a값이 b값 바로 전 정수까지 다 다랐다는 말이다. 

 

 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는

입력된 string의 길이가 짝수인지 홀수인지 체크해주고 중간값을 반환하는 부분이다. 

 

 

내 풀이


2로 나눈 나머지값으로 짝/홀을 확인한다. 문제도 그렇고 어렵지 않은 내용인듯 하다.

 

다른 사람의 풀이


일단 짝/홀을 비교하는 조건문이 없다.   Substring(시작인덱스,시작인덱스로부터 몇번까지)으로  반환하고있다. 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는

첫 번째로, 여벌은 1개이기에 중복적으로 빌려줄 수 없도록 해야한다.

두 번쨰로는 잃어버린 학생과 여벌로 가져온 학생이 같을 수 있다. (당연히 여벌은 1개라 빌려줄 수 없다.)

 

 

내 풀이


잃어버린 학생배열과 여벌을 가져온 학생배열을 list로 옮긴 후 두 배열을 비교하여 중복된 값을 구한다.(두 번째 고려사항)

마지막 foreach문에서 빌려줄수있는 학생배열을 순회하면서 빌려준 학생은 다시 빌릴 수 없도록 삭제시켜주고 있다.(첫 번째 고려사항) 

 

 

다른 사람의 풀이


우선 차이점으로 중복된 값을 걸러내기위한 반복문을 사용하지않고 Linq기능을 사용하여 lost, reserve배열 서로 중복되지 않는 값만 입력받았도록 하고있다.

Linq기능을 사용하면 간결하고 연산 횟수가 줄지만, 가비지가 생성하기에 게임을 개발에 사용하기에는 적절하지 않다.   

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는 1,2,3학생 답 배열의 담겨있는 수들의 규칙이다.   

 

 

내 풀이


학생 답 각각 배열을 생성하고 문제에서 보여주는 값들 중 다시 반복이 되는 수 전까지 담아준다.  

int[] st1 = new int[5] { 1, 2, 3, 4, 5 }

int[] st2 = new int[8] { 2, 1, 2, 3, 2, 4, 2, 5 }

int[] st3 = new int[10] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }

그리고 정답배열을 순회하면서 학생 배열과 비교하고 학생배열의 값과 같다면 정답카운트인 score 배열의 값을 변경 시켜주도록 한다.  (코드는 5,8,10으로 나누었지만 확장성으로 st1.Length으로 나누어도 된다)

제한조건으로 최고점자가 동률이 나오면 오름차순으로 모두 출력해주어야 하기 때문에 for문을 통해 최대값을 구하고 그 값과 같은 배열만 list에 담도록 했다. 

 

다른 사람의 풀이


우선 차이점으로 학생배열을 2차원 배열로 만들고, 이중for문을 통해 if문 한개로 모든 학생배열을 순회하는 방식으로 정답카운트를 체크하고 있다. 그리고 배열.Max()함수를 통해 최대값을 찾고 그 리스트를 리턴하는 방식이다

내 코드처럼 각각 배열을 3개 생성하지 않고, 이차원배열로 생성했으며, if문으로 각자 배열을 매직넘버인 1,2,3를 넣어서 순회하는 것이 아닌 이중포문으로 한번에 비교를 한다는점에서 더 효율적인 풀이법인 것같다.


 

 

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제

문자열 배열을 받아서 위에서 부터 차례대로 받는다고 생각하고, 입력된 문자열중에 같은 문자열이 있으면 문자열 끝에 '(1)'을 추가해준다. ex) a라는 문자열이 존재한 상태에서 a를 추가하면 새로 추가한 문자열은 a(1)이된다. 그 다음 다시 a를 넣으면  a가 있기 때문에 a(1)으로 바꿔준다. 그런데 또 a(1)이 있기 때문에 a(2)로 바꿔준다. 

가장 이해하기 좋은 테스트 문제

풀이 : 내가 작성한 코드

배열을 통째로 받지만 함수안에서 위에서부터 처음부터 받는다고 생각해야한다. 일단 문자열을 관리 할 수있는 컨테이너를 만든 뒤, 문자열을 하나 추가하면 그 컨테이너에서 새로 추가한 문자열이 중복이 있는지 체크한다. 그런데 여기서 한번 더 생각해야 할 것이 처삽입될 문자열을 바꾸고, 또 다시 컨테이너를 탐색해야한다. 컨테이너의 같은 문자열이 있을 수는 없기 떄문이다.   for문으로 체크하기에는 배열의 인덱스와 요소 체크하기가 까다로울 것 같고, while문으로 삽입된 리스트들을 통째로 탐색하도록 한다.

count를 통해 같은 문자열의 갯수를 체크하고 문자열의 값을 변경하면서 while문을 통해 list를 탐색한다.

풀이 : 다른 사람이 작성한 코드

while(!set.Add(cade))를 통해 중복된 문자가있으면 카운트를 증가시키고 그렇지 않으면 set에 추가 하게된다. HashSet은 잘 사용하지 않았었는데 HashSet.Add에는 bool반환형이 있다. 추가되었으면 ture, 요소가 이미 있으면 false를 리턴한다.

 

문제 : https://codesignal.com/

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제

','를 구분한 문자열중 가장 긴 문자열을 구하는 문제이다. 특수문자 제외,  쉼표(',')제외

풀이 : 내가 작성한 코드

빈 문자열 변수를 만들어 놓고 a~z || A <Z 사이에 포함되는 문자들만 입력한다. else는 ','를 받게되면 다음 문자열의 길이를 비교하여 다음 문자열을 만들 준비를 한다.  고려할 부분은 띄어쓰기와 특수문자를 제외하는 방법 이 두가지 정도가 있을 수 있다. C#문법만 하더라도 여러가지 방법이 있겠지만 나는 문자의 범위를 비교하였다. 

풀이 : 다른 사람이 작성한 코드

Regex.Matches 문법을 사용했다. 입력 문자열에 있는 정규식을 모두 검색하고 일치 항목을 모두 반환한다고 한다. 그러면 자동적으로 띄어쓰기와 , 특수문자를 제외 시킨 문자가 m 입력된다. C#에는 다양한 문법이 있지만 게임에서 적용은 하기 힘들듯하다.

https://docs.microsoft.com/ko-kr/dotnet/api/system.text.regularexpressions.regex.matches?view=netframework-4.8

문제 : https://codesignal.com/

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제

문제는 길지만 테스트문제를 보면 쉽게 이해 할 수 있었다. 

문자열을 체크하여 숫자만 뽑아내어 그 숫자들의 합을 리턴하는 문제이다.

풀이 : 내가 작성한 코드

단순히 문자열을 for문을 통해 char요소를 하나씩 체크하여 숫자가 나오면 새로 생성한 int형 변수에 차근차근 더하여 계산 하려했지만, 숫자가 붙어있는 경우(즉 1자리를 넘는 경우)에도 모두 1의자리로 계산이된다.  그러면 숫자를 그때마다 int형으로 바꿔서 더하지 말고 십의자리 그 이상의 자리까지를 대비가 필요하다. char형 문자를 체크하면서 숫자가 나오면 string변 수에 넣어준다. 다음 문자가 숫자가 아닐때 까지, 숫자가 아닐 때 까지 모두 더한 string변수를 int형으로 변경하여 값을 더 해준다.

두번째 if문에서 temp !=""를 체크하는 이유 : 첫 번째 if문은 숫자가 아닐 경우 temp에 있는 값을  sum 변수에 더해주고 있다. 문자열 마지막요소의 형식이 숫자라면 그 전까지 더한 temp를 넘기게된다. 그래서 마지막 체크를 한번 더 해줬다. 

풀이 : 다른 사람이 작성한 코드

foreach(Match match in Regex.Matches(inputString, "[0-9]+") 지정한 정규식을 통해 stirng 숫자값만 딱 뽑아진다.

 

문제 : https://codesignal.com/

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제

올바른 시간을 표현하고 있는지 여부를 체크하는 문제이다. 시간 00부터 ~23까지/ 분은 0부터 59까지 표현이 가능하다는 부분

풀이 : 내가 작성한 코드

C#에는 Split라는 함수 덕분에 ':'기준으로 나눈 문자열을 배열로 쉽게 받을 수 있다. 시간을 나타내는 time[0]과 분을 나나태는 time[1]로 나뉘게 된 것이다.  int.Parse를 통해 숫자로 바꾸어주고 24와 59를 비교해준다. 

풀이 : 다른 사람이 작성한 코드

어렵지 않은 문제라 C#함수를 사용한 짧은 코드보다 다른 방법으로 접근한 코드들을 찾아봤다. 

디버깅 해보니 DateTime dummy에는 현재 날짜와 매개변수로 받은 time이 시간,분으로 입력되었다. ParseExact함수 두 번째 문자열은 시간,분을 받는 형식을 지정해준다. 이 형식또는 시간규칙에 맞지 않으면 catch해주도록 한다.

 

문제 : https://codesignal.com/

반응형

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제

중복된 문자를 개수를 파악해서 문자와 같이 표기해준다. 중복된 문자가 없을 경우 문자만 출력해야 한다.

풀이 : 내가 작성한 코드

어려운 문제는 아닌데 문자열 string을 char로 받아 현재 문자와 다음 문자의 중복 여부를 확인한 뒤 반복문으로 확인했다. 문제는 s [i+1]로 확인하려다 보니 다음 인덱스의 범위가 벗어나서 오류가 떴다. 원래는 while문을 (s[i] == s[i+1])로 했었는데 배열의 길이를 확인하는 것으로 바꿨다. 역시 if, else가 너무 많다. 

풀이 : 다른 사람이 작성한 코드

삼항 연산자를 사용해서 if, else 문도 적고 foreach를 사용하면 나처럼 인덱스 범위를 벗어나는 경우를 체크할 필요가 없었다.  알고리즘 문제를 풀 때 좀 더 여러 방법으로 접근하는 습관을 길러야겠다.

문제 : https://codesignal.com/

반응형

문제

MAC-48 주소를 표준 (IEEE 802) 형식은 하이픈으로 구분 된 2 개의 16 진수 숫자 (0 ~ 9 또는 A ~ F)의 6 개 그룹입니다 (예 : 01-23-45-67-89- AB).

 

풀이 : 내가 작성한 코드

하이픈 '-'을 기준으로 문자가 16진수로 변환했을 때 'F'를 넘어서는 안된다. (대소문자 다름'F'!='f')

'-'사이로 문자가 2개가 있어야 한다.

이 정도 조건문을 가지고 실행했을 경우 생각하지 못한 조건들이 있었다. 

1) '-'개수가 5개가 아닌 경우  ex) '-'하이픈이 아예 없을 경우에도 true를 반환 할 것이다. 

2) 문자열의 길이가 17이 아닌 경우  ex) "-----" 위 조건들만 있을 경우 이 하이픈만 있는 문자열도 true를 반환 할 것이다. 

첫 번째 if문 17개가 아닐경우를 체크한다.

마지막 return문에서 삼항연산자로 '-'이 6이상,0일때 체크해주고있다. (1번조건)

 

풀이 : 다른 사람이 작성 한 코드

string[ ] l = s.Split('-') : '-'을 기준으로 제외한 문자열을 배열에 담는다. ex) "00-1B-63-84-45-E6" => {00, 1B ,63 ,84 ,45 ,E6}

if(l.Length !=6 ) : '-'을 제외한 문자열의 길이가 6이 아니면 false

if (!(c.Length == 2 && ((c[i] >= '0' && c[i] <= '9') || (c[i] >= 'A' && c[i] <= 'F')))) : 배열의 요소인 문자열의 길이가 2이어야 하고, 0보다 같거나 크고 9보다 같거나 작거나 또는 A,F마찬가지로 비교한다. 

 

느낀점 : string.Split로 '-'를 없애면서 첫 번째 문자열의 길이를 체크하는if문을 없애고, 그 없앤 문자열을 가지고 비교를 좀 더 간단하게 비교가 가능해졌다.  if else가 많이 줄었다. 

반응형

문제

'@'문자 이후에 문자들을 출력하는 문제이다.

처음 '@'나온 이후부터 구조체에 넣어서 출력하면 될 줄 알았는데

위 테스트 문제처럼 '@'가 여러개인 경우도 있다.

풀이 : 내가 작성한 코드

.

for문을 통해 '@'문자가 나온 후 그 이후에 문자들을 문자열 s에 넣는다.

그런 뒤 한번더 '@'문자가 나올 경우를 체크하고 만약 '@'가 또 나온다면 s 문자열을 비우고

다시 '@'이후 문자 들을 담는다.

풀이 : 다른 사람 코드

게임개발에는 사용하기 힘들지만 강력한 기능 LinQ.

Split('@').Last()로 한번에 구할 수가 있었다.

  

반응형

문제

bishop이 pawn을 대각선으로만 이동해서 잡을수 있다.

잡을 수 있으면 true / 못 잡으면 false

풀이 : 내가 작성한 코드

(bishop[0] + bishop[1]) % 2 == (pawn[0] + pawn[1]) % 2 :

문자열의 알파벳과 숫자의 합이 짝수 이거나 홀수로 두 문자열이 같아야한다.(홀이거나 짝수)

bishop[0] != pawn[0]문자 앞 알파벳이 같으면 대각선이 아니므로 체크

 

풀이 : 다른 사람이 작성한 코드

알파벳끼리 빼고 숫자끼리 뺀값은 결국 대각선으로 증감되는 값이 나온다. 

ex )

(a1,b2) : (a-b)==(1-2)

(a1,c3) : (a-c)==(1-3)

....

반응형

문제

문자열을 받고 그 문자열에 연속된 숫자를 출력하는 문제이다. 

처음 문자가 비었다면 return : Empty

풀이 : 내가 작성한 코드

if(inputString.Length==0) : 문자열이 없을 때 비어있는 문자열 리턴

if(char.IsDigit(val) : 숫자인지 체크하고 숫자가 아닐 경우 break로 반복문 빠져나온다.

ss += val : 숫자일경우 문자열을 완성시킨다. 

풀이 : 다른 사람 코드

if( c.Equal("  ") || !Char.IsNumber(c))  : 첫문자열이 비어있거나, 숫자가 아니면 return

반응형

문제

'abcdc'를 뒤집어도 똑같은 문자열이 나오는 최소조건을 만드는 문제이다.

최소조건이란 최대한 적은 문자를 사용하라는 말이다.

 

풀이

처음에 문자열을 맨앞과 맨뒤를 비교하면서 같으면 넘어가고 다를 경우 기존 문자열에 추가하면 될거라고

생각했지만 하나의 문자열의 같은 문자가 반복되는 경우가 있기 때문에 정답이 될 수 없었다. 

다른 자료구조가 필요했다.

 

int pos : 문자열의 역순으로 들어갈 인덱스번호(pos번째까지)

int Length = st.Length;  :  문자열의 길이

 

예로 'abcdc'를 입력한다고 하자

if(st[iif (st[i] != st[j]) : 

{

 i = ++pos;
 j = Length - 1;

}

문자열의 맨앞과 맨뒤를 비교해서

다를 경우 맨앞의 문자열의 인덱스( pos증가 )를 한 칸 이동한다.

계속 해서 i를 증가시켜 맨 뒤 문자와 비교하다가 같은 문자가 나오면

맨 뒤를 가리키는 인덱스도 앞으로 이동해준다.

앞 뒤 문자가 같다는 말은 뒤집었을때 최소조건이 될 수도 있다는 말이다.

 

여기서 for문 조건을 통해 i가 h를 넘었다면 반복문을 종료한다.

하지만 종료조건이 아니라면 계속해서 내가 처음 생각했던 구조처럼

같은 문자가 반복되는 경우가 있기 때문에 계속 비교를 이어나가면 된다.

 

입력받은 문자열에 앞에서 부터 pos번째까지가 뒤집었을때 최소조건을 충족하는 문자들이 된다.

 

 

 

 

 

 

반응형

+ Recent posts