프로그래머스 코딩테스트 연습

[프로그래머스 코테 C#] Lv2. 최댓값과 최솟값

노재두내 2024. 6. 2. 14:26

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

제한 조건

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

입출력 예

sreturn

"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"

문제를 보자마자 생각난건 공백으로 구분하기가 생각났다.

C# 공백으로 구분이라고 쳐서  String.Split 검색

string[] words = phrase.Split(' '); //여기서 phrase는 공백이 포함된 문자열 

 

그래서 문제에서는

public string solution(string s) {
        string[] numbers=s.Split('');
}

이렇게 써줬다.

 

왜 오류날까

아 ' ' 사이에 공백을 하나도 안넣어줘서 그랬다ㅋㅋ

public string solution(string s) {
        string[] numbers=s.Split(' ');
        }

명시적 변환

int min=(int)numbers[0];

 ==> 해결안됨

 

 

Int32.Parse 로 해결해보려고함

for(int i=0;i<numbers.Length;i++)
        {
            int min=Int32.Parse(numbers[0]);
            if(numbers[i]<min)
            {
            }
        }

/Solution0.cs(12,23): error CS0019: Operator `<=' cannot be applied to operands of type `string' and `int'

numbers[i]는  string이고 min은 int 라서 비교 연산자 불가능

 

그러면 numbers[i] 배열을 모두 숫자로 변환해야 할것같음 

 

문자열 배열을 숫자로 변환하는 방법은 두가지가 있는것 같다.

1. Array.ConvertAll()

string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = Array.ConvertAll(temp_str, s => int.Parse(s));

 

2. LINQ의 Select() 메서드를 사용

string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int1 = temp_str.Select(int.Parse).ToArray();

 

당연히 using System.Linq; 써줘야함

 

참고한 블로그

https://www.delftstack.com/ko/howto/csharp/csharp-convert-string-array-to-int-array/

 

C#에서 문자열 배열을 Int 배열로 변환

이 가이드에서는 C#에서 string형 배열을 int 배열로 변환하는 방법을 배웁니다.

www.delftstack.com


나는 Array.ConvertAll() 를 사용해본다

string[] numbers=s.Split(' ');
int[] temp_int = Array.ConvertAll(numbers, a => int.Parse(a));
        
        for(int i=0;i<temp_int.Length;i++)
        {
            int min=temp_int[0];
            
            if(temp_int[i]<min)
            {

            }
         }

이제 오류 안난다 !!

 

이제 기본은 다져놨으니 최댓값과 최솟값 구하는 코드만 작성하면 된다.


일단 생각나는데로 이렇게 작성해보고 Console.WriteLine으로 값이 어떻게 변화하는지 확인해보자

using System;

public class Solution {
    public string solution(string s) {
        string answer = "";
        string[] numbers=s.Split(' ');
        int[] temp_int = Array.ConvertAll(numbers, a => int.Parse(a));
        
        for(int i=0;i<temp_int.Length;i++)
        {
            //초기화
            int min=temp_int[0];
            int max=temp_int[0];
            
            //최솟값
            if(temp_int[i]<min)
            {
                min=temp_int[i];
            }
            //최댓값
            if(temp_int[i]>max)
            {
                max=temp_int[i];
            }
            Console.WriteLine("min={0},max={1}",min,max);
        }
        return answer;
    }
}

아직 answer에 대입을 안해서 그렇지 마지막 결과값이 기댓값이랑 일치하게 나옴


이제 answer에다가 대입해보쟝

answer=min+" "+max;

===> 테스트 케이스는 통과했지만 채점하니까 틀렸음 

다시 생각해보쟈 ,,


테스트 케이스 추가하고 해보기

테스트케이스 실패 ! 

찍어보니 max 가 10이었다가 0이 되어버리는 현상?

for(int i=0;i<temp_int.Length;i++)
        {
            //초기화
            int min=temp_int[0];
            int max=temp_int[0];

아 for문 안에서 초기화를 자꾸 해주니까 그랬음

이전 테스트케이스가 통과한게 의문이군

 

암튼

[최종코드]

using System;

public class Solution {
    public string solution(string s) {
        string answer = "";
        string[] numbers=s.Split(' ');
        int[] temp_int = Array.ConvertAll(numbers, a => int.Parse(a));
        //초기화
        int min=temp_int[0];
        int max=temp_int[0];
        
        for(int i=0;i<temp_int.Length;i++)
        { 
            //최솟값
            if(temp_int[i]<min)
            {
                min=temp_int[i];
            }
            //최댓값
            if(temp_int[i]>max)
            {
                max=temp_int[i];
            }
            answer=min+" "+max;
        }
        
        return answer;
    }
}

오예 ~.~


[다른 사람 풀이]

using System.Linq;
public class Solution {
    public string solution(string s) {
        string answer = "";
        int[] temp = s.Split(' ').Select(int.Parse).ToArray();
        answer = temp.Min().ToString() + " " +temp.Max().ToString();
        return answer;
    }
}

 

Linq의 Min,Max 메서드를 사용하면 쉽게 구할 수 있다.