[프로그래머스 코테 C#] Lv2. 최댓값과 최솟값
문자열 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 메서드를 사용하면 쉽게 구할 수 있다.