C#

[C#]List 거꾸로 뒤집기(Reverse)

DevStory 2021. 10. 3.

이번 포스팅에서는 C#에서 List를 거꾸로 뒤집는 방법에 대해 설명합니다.

 

.Net FrameWork에서 지원하는 라이브러리를 사용하는 방법과 라이브러리를 사용하지 않고 반복문을 사용하는 방법을 정리하였습니다.

 


뒤집어진 List를 생성하는 Enumerable.Reverse() 메서드

Enumerable.Reverse() 메서드를 사용하면 원본 List 인스턴스를 변경하지 않고 새로운 List를 생성합니다.

 

다음 코드는 Reverse() 메서드를 사용하여 값이 뒤집어진 새로운 List 인스턴스를 생성합니다.

List<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
// 변환된 객체를 ToList() 메서드를 사용하여 List로 생성함
List<int> reverseList = Enumerable.Reverse(intList).ToList();

Console.WriteLine($"intList : {String.Join(", ", intList)}");
Console.WriteLine($"reverseList : {String.Join(", ", reverseList)}");

실행 결과

 

ToArray() 메서드를 사용하여 배열도 값을 뒤집을 수 있습니다.

string[] strArr = {"A", "B", "C", "D", "E"};
string[] reverseArr = Enumerable.Reverse(strArr).ToArray();

Console.WriteLine($"strArr : {String.Join(", ", strArr)}");
Console.WriteLine($"reverseArr : {String.Join(", ", reverseArr)}");

실행 결과


기존 List를 변경하는 List<T>.Reverse() 메서드

List<T>.Reverse() 메서드를 사용하면, 원본 List 인스턴스의 요소를 뒤집어진 값으로 덮어씁니다.

 

원본 값이 보존되지 않는 단점이 존재합니다.

 

다음은 List<T>.Reverse() 메서드를 사용한 코드입니다.

List<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
Console.WriteLine($"intList : {String.Join(", ", intList)}");

intList.Reverse();
Console.WriteLine($"intList : {String.Join(", ", intList)}");

실행 결과

 

배열은 Array.Reverse() 메서드를 사용합니다.

 

마찬가지로 원본 값이 보존되지 않습니다.

 

다음은 배열의 값을 뒤집은 코드입니다.

string[] strArr = {"A", "B", "C", "D", "E"};
Console.WriteLine($"strArr : {String.Join(", ", strArr)}");

Array.Reverse(strArr);
Console.WriteLine($"strArr : {String.Join(", ", strArr)}");

실행 결과


List<T>.RemoveAt() 메서드

반복문을 사용하여 원본 List에 있는 값을 재정렬할 수 있습니다.

 

이 방법은 List의 끝에 있는 값을 변수에 할당한 뒤 RemoveAt() 메서드를 사용하여 제거합니다.

 

변수에 할당한 값을 Insert() 메서드를 사용하여 앞에 추가합니다.

List<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
Console.WriteLine($"intList : {String.Join(", ", intList)}");

for (int i = 0, j = intList.Count - 1; i < j; i++)
{
// 임시 변수에 할당
int temp = intList[j];
// 임시 변수에 할당 후 값 삭제
intList.RemoveAt(j);
// 임시 변수에 핟랑한 값을 List에 추가
intList.Insert(i, temp);
}

Console.WriteLine($"intList : {String.Join(", ", intList)}");

실행 결과


반복문을 이용

메서드를 사용하지 않고 반복문을 사용하여 개발자가 로직을 구현할 수 있습니다.

List<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
int n = intList.Count;

Console.WriteLine($"intList : {String.Join(", ", intList)}");

for (int i = 0; i < n / 2; i++)
{
    int temp = intList[i];
    intList[i] = intList[n - i - 1];
    intList[n - i - 1] = temp;
}

Console.WriteLine($"intList : {String.Join(", ", intList)}");

실행 결과

 

위 코드의 로직은 반복문이 증가하면서 대칭되는 위치의 값을 교환하는 로직입니다.

 

반응형

댓글