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
반응형
'코딩테스트' 카테고리의 다른 글
C# [프로그래머스] Lv.1 나머지가 1이 되는 수 찾기 (0) | 2024.02.07 |
---|---|
C# [프로그래머스] Lv.1 삼총사 (0) | 2024.02.06 |
C# [프로그래머스] Lv.1 과일 장수 (1) | 2023.12.28 |
C# [프로그래머스] Lv.1 카드 뭉치 (0) | 2023.12.26 |
C# [프로그래머스] Lv.1 덧칠하기 (0) | 2023.12.26 |