비트를 쪼개는 개발자

allen321@naver.com

코딩테스트

C# [프로그래머스] Lv.1 숫자 짝꿍

MozarTnT 2024. 2. 5. 18:18
728x90
반응형

 

 

문제를 분석한 후 최대한 단순하게 풀어보니 

 

String X값, String Y값을 한자리씩 받아올 char 리스트를 먼저 선언했다.

 

--------------------------------------


이후 x의 각 인덱스 자리에서 y와 contain 되는게 있는지 확인 후 있으면 새 리스트에 해당 인덱스 값을 위치 시킴

이후 y에서 해당 숫자 remove 

x의 자릿수 만큼 반복 수행 후 

새로 만들어진 리스트의 각 자리를 높은 순서대로 int값으로 위치시키는 방식을 for문 및 if문을 중첩하여 풀이했다.

겹치는게 없다면 return -1 을 출력하고 마무리 하였는데 

 

 

문제는....

 

 

1번.

 

0이 여러개 겹치는경우 이를 0으로 받아온게 아니라 각 자리마다 '0000' 을 여러개 받아오는 문제.

 

2번.

 

for문을 중첩시키다보니 이를 검사하기 위해선 최악의 경우에는 최대 자리수인 ( 3,000,000 x 3,000,000 ) 자리수 까지 검사를 해야 했고,

시간 복잡도 검사에서 실행 결과를 통과하지 못했다.

 

 

이후 

 

코드의 반복 검사를 최소화 한 코드로 변경하였고,

 public class Solution
 {
     public string solution(string X, string Y)
     {
         List<char> x_ints = X.ToList();
         List<char> y_ints = Y.ToList();
         x_ints.Sort();
         y_ints.Sort();
         // string 문자열에서 받아온 숫자들을 char 리스트로 변환 및 정렬

         List<char> answer_List = new List<char>();

         // ----------------------

         int index_X = 0;
         int index_Y = 0;
         // while 문의 범위 설정을 위한 index를 임의로 지정함.
         while (index_X < x_ints.Count() && index_Y < y_ints.Count())
         {
             if (x_ints[index_X] == y_ints[index_Y]) // 두 값이 같은 경우가 공통 숫자를 찾은것 임으로 answer_List에 추가
             {
                 answer_List.Add(x_ints[index_X]);
                 ++index_X; // 다음 while문을 졸리기 위해 인덱스 값을 증가
                 ++index_Y;
             }
             else if (x_ints[index_X] < y_ints[index_Y])
             {
                 ++index_X; // 값이 다른 경우 다음 루프를 돌기 위해 작은 쪽의 인덱스를 증가시킴
             }
             else
             {
                 ++index_Y;
             }
         }

         if (answer_List.Count() == 0) // 모든 while문을 돌렸음에도 공통된 수가 없다면 -1을 반환
         {
             return "-1";
         }

         if (answer_List[answer_List.Count() - 1] == '0') // 공통된 수가 전부 0인 경우에는 0이 여러개가 출력될 수 있으므로 임의로 '0'을 반환
         {
             return "0";
         }
         answer_List.Reverse(); // 현재 오름차순으로 정렬되어 있으므로 가장 큰 수를 만들기 위해 내림차순으로 정렬

         return (new string(answer_List.ToArray())); // 리스트를 char array로 변환 후 문자열로 변경 
     }
 }

 

 

728x90
반응형