C#/복습 완료

문자열 정렬하기 (2) (복습 완료)

게임 개발은 즐거워 2025. 9. 2. 13:19

개선 코드

* 일반 코드 

using System;

public class Solution {
    public string solution(string my_string) {
        char[] chars = my_string.ToLower().ToCharArray();
        Array.Sort(chars);
        
        return new string(chars);
    }
}

1. 나 : 대문자만 변환 / 모든 문자를 변환해도 괜찮음 (불필요한 조건)

2. string 내장 메서드 사용해서 소문자로 변환

-> 반복문없이 문자열의 문자들 소문자로 변환 가능 


+) string의 내장 메서드들

// String 내장 메서드들
my_string.ToLower();        // 소문자 변환
my_string.ToUpper();        // 대문자 변환  
my_string.Trim();           // 공백 제거
my_string.Replace('a', 'b'); // 문자 치환
my_string.Substring(0, 5);   // 부분 문자열
my_string.Split(',');        // 문자열 분할
my_string.Contains("abc");   // 포함 여부

 

3. char Array를 string으로 변환할 때, 중간 변수 선언 후 대입 x / 바로 반환 가능 ! 

- 중간 변수 선언 후 대입

string answer = "";
answer = new string(charArray);
return answer;

- 바로 반환 

return new string(charArray);

-> return new string(charArray)로 해도 괜찮음 

=> 중간 변수 선언 없이 생성자를 바로 return문에서 사용

 

* LINQ

using System;
using System.Linq;

public class Solution {
    public string solution(string my_string) {
        return new string(
            my_string
                .Select(char.ToLower)
                .OrderBy(ch => ch)
                .ToArray()
        );
    }
}

- Select(char.ToLower) : 각 문자에 char.ToLower 함수를 적용 (= 소문자로 변환)

* 결과 동일 (람다 표현식 / 메서드 그룹)

cf. 메서드 그룹 = 람다 표현식의 축약형 / 람다 표현식 : 파라미터명을 명확히 하고 싶을 때 사용

my_string.Select(ch => char.ToLower(ch));      // 소문자 변환
my_string.Select(char.ToLower);                // 메서드 그룹 사용 (간결)

- OrderBy(ch => ch) : 각 문자를 기준으로 오름차순 정렬

- ToArray() : 결과를 배열(char Array)로 변환 

- new string(...) : char 배열을 string으로 변환(= 문자열 생성)

-> 문자열의 각 문자를 소문자로 선택하고, 순서대로 정렬해서, 배열로 만든 다음, 문자열로 변환해라  

 

다시 푼 것

using System;

// 입력 : 영어 대소문자로 이루어진 문자열 my_string
// 출력 : 모두 소문자로 바꿔서, 알파벳 순서대로 정렬한 문자열 answer 

// 대문자 구분 : IsUpper (<-> IsLower)
public class Solution {
    public string solution(string my_string) {
        string answer = "";
        
        // string으로 char변환 : 불가능
        // charArray로 반복문
        // 인덱스 접근 -> for문
        
        // 와 결과값 ""라고 떴는데, answer을 넣어버렸네...
        //char[] charArray = answer.ToCharArray();
        char[] charArray = my_string.ToCharArray();
        
        for (int i = 0; i < charArray.Length; i++)
        {
            // IsUpper은 bool이 아니라고 에러뜸!
            //if (charArray[i].IsUpper)
            // 아 이게 아니라 char 정적메소드? 
            //if (charArray[i].IsUpper())
            if (char.IsUpper(charArray[i]))
            {
                // 이것도 마찬가지일듯?
                //charArray[i].ToLower();
                //char.ToLower(charArray[i]);
                char temp = char.ToLower(charArray[i]);
                charArray[i] = temp;
            }
        }
        // 앗 이것도 틀림
        //charArray.Sort();
        Array.Sort(charArray);
        
        // string으로 변환
        answer = new string(charArray);
        
        return answer;
    }
}

 

 

 

이전에 풀던 것

using System;

// 입력 : 문자열 my_string
// 출력 : 모두 소문자로 바꾸고, 알파벳 순서대로 정렬한 문자열 answer 
public class Solution {
    public string solution(string my_string) {
        string answer = "";
        
        // 아... foreach는 ch에 직접 접근 안 되나? 아무튼 이거 안 됨! 
        foreach(char ch in my_string)
        {
            if(ch)    
        }
        
        return answer;
    }
}

 

 

1. string은 불변이라 index로 접근해서, char 값 바꾸기 불가능

-> string.ToCharArray() 사용해서 charArray로 변환하기

2. 인덱스 사용 -> foreach말고 for문 사용하기 

3. char 대소문자 구분 : char.IsUpper(char c) / char.IsLower(char c)

https://learn.microsoft.com/en-us/dotnet/api/system.char.isupper?view=net-9.0

 

Char.IsUpper Method (System)

Indicates whether a Unicode character is categorized as an uppercase letter.

learn.microsoft.com

* 사용법

// char : IsUpper(Char)
char.IsUpper(char c)


// string : IsUpper(string, int)
string.IsUpper(string s, int index)

4. IsUpper(char c) / IsLower(char c)는 정적 메서드 ! 

// 모두 static 메서드
char.IsUpper('A');      // True
char.IsLower('a');      // True  
char.IsDigit('5');      // True
char.IsLetter('A');     // True
char.ToUpper('a');      // 'A'
char.ToLower('A');      // 'a'
char.IsWhiteSpace(' '); // True

-> char는 기본 타입(value type)
=> 메서드를 가질 수 없으므로 유틸리티 메서드들을 static으로 제공
cf. string : 참조 타입 -> string_name.ToUpper();로 사용

5. 배열 정렬도 정적 메서드 : Array.Sort(Array array)

6. char 대소문자 변환 : char.ToLower(char c) / char.ToUpper(char c)

7. char.ToLower / char.ToUpper : 새 값을 반환하지만, 원본을 변경하지 않음

-> 반환값을 꼭 받아서 다시 대입하기 ! 

8. charArray string으로 변환 : string = new string(charArray)