문제

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/

반응형

인접 행렬법

단점 : 메모리낭비 그래프의 정점의 개수를 V라고 하면 V * V행렬을 이용하여 표현한다. Vi가 행렬 i행과 i열에 대응된다고 할 때 만일 Vi와 Vj간의 간선이 있을 경우 [i,j]와 [j,i]요소를 1로 하고, 아닌 경우는 0으로 한다.

 

인접 리스트법

단순 연결리스트를 이용하여 각 정점에 간선으로 연결된 정점들을 주렁주렁 달아놓는 방법을 말한다. 인접행렬법과 대조적으로 인접리스트법에서는 그래프를 반사적으로 구성하기 위해 명시적으로 정보를 저장하지 않는다. 모든 간선에 대한 정보를 저장하지는 않는다. 정점에서 가능한 필요한 간선만 기록하게 된다.

 

탐색

우선탐색(DFS)과 너비 우선 탐색(Breadth First Search,BFS)방법이 있다. 나무와 다르게 그래프는 방향성이 없기 때문에 순서가 매번 다르다.

인접행렬의 깊이 우선 탐색

시작 정점에서 시작하여 그 정점과 연결된 정점으로 다음에는 그 정점에서 다시 연결된 정점의 순으로 진행된다.(당연히 방문한 정점은 다시 방문하지 않는다)

=> 탐색의 위치가 간선을 따라 깊이 들어가면서 움직인다.

비재귀

스택을 사용, 유일한 순회 순서가 존재하지 않음

인접 리스트의 깊이 우선 탐색

정점의 연결 상태를 알아내는 방법이 인접행렬과 다르다. 인접리스트로 그래프를 구현할 경우에는 순회 순서가 간선의 입력 순서에 민감하다.

먼저 입력된 간선이 각 리스트에서 앞에 위치하게 된다.

방문하지 않은 모든 요소를 탐색 ver

 

인접 행렬의 너비 우선탐색

깊이 우선 탐색과 대조적으로 우선 시작하는 정점과 연결된 정점을 탐색하고 다시 시작 정점의 다른 연결된 정점을 찾는 순으로 탐색한다.  트리순회의 레벨순회와 비슷하다고 생각하면 된다.

그래프의 불규칙성과 여러 개의 연결 요소로 구성된 다는 점을 고려해야 하므로 방문한 정점에 대한 체크가 필요하다. 재귀 호출 부분은 하나의 연결 요소만을 탐색하게 되므로 탐색 부분의 바깥에서 각 연결 요소의 시작 정점을 찾아내어 탐색을 시켜주는 부분이 필요하다.

인접리스트의 너비 우선 탐색

 

학습참고 : c로배우는 알고리즘

반응형

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

빨간색 : 해결방법

초록색 : 느낀점

문제

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

풀이 : 내가 작성한 코드

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

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

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

문제 : https://codesignal.com/

반응형

+ Recent posts