C# 컬렉션으로 인덱스 순환 | ABUHAKMEH

간단하지만 흥미로운 문제네요. 두 개의 구현체가 있고 글을 올린 후 제 버젼도 댓글로 올려 보겠습니다.

문제는 인덱스가 리스트의 범위에 상관없이 아래의 그림처럼 순환하여 값을 반환하는 메소드를 구현하는 것입니다. 여러분도 같이 풀어보시죠.

image


1개의 좋아요

제 코드입니다.

var items = Enumerable
    .Range(1, 10)
    .ToList();

var indexes = new[] { 20, -1, -20, -15, 5, -23 };

var results = indexes
    .Select(index => (index, items.IndexAtLooped(index)))
    .ToList();

foreach (var (index, result) in results)
    Console.WriteLine($"{index,3}: {result}");


public static class EnumerableExtensions
{
    public static T? IndexAtLooped<T>(this IList<T>? collection, int index)
    {
        if (collection is null || collection.Any() is false)
            return default;

        var total = collection.Count;
        index %= total;
        if (index < 0)
            index += total;

        return collection[index];
    }
}

| 결과

 20: 1
 -1: 10
-20: 1
-15: 6
  5: 6
-23: 8
2개의 좋아요

파이썬 소스코드 포팅할 때 유용하겠군요. ^^

2개의 좋아요

이 글은 열심히 코딩 배우시는 분들을 위해 남겨봅니다.

코드의 익숙한 정도에 따라, 사고훈련의 정도에 따라서 이런 문제가 쉽게 느껴지기도 하고 어렵게 느껴지기도 합니다.

어떤 분은 상당히 빠른 시간에 본인만의 코드를 작성하시는 분도 계실 것 같고
오래 걸리거나 풀지 못하는 분도 계실 것 같은데요,

혹시 코딩을 정말 열심히했는데도 잘 안되시는 분 포기하지 마시고 계속 꾸준히 해보시길 권합니다.

보통 알고리즘 문제를 풀려고 할 때 그 경험도 중요하지만 다양한 문제를 풀다보면 본인만의 문제해결 능력이 생깁니다. 그리고 나름의 접근 방법을 알게 되는데요 위 문제의 경우,

인덱스가 양수일 때와 음수일 때 코드를 어떻게 짜야 효과적인지를 고민하게 됩니다. 그리고 규칙을 찾아가게 되는데요 저는 다음의 방법으로 규칙을 찾았습니다.

  1. 구분 - 인덱스가 양수인 경우와 음수인 경우를 구분
  2. 샘플링 - [1, 2, 3, 4, 5]
  3. 패턴 파악 - 인덱스를 리스트 범위로 변경 (index = index % length)
  4. 조정 - 음수일 경우 +length

이 문제 뿐만 아니라 대부분의 문제의 접근은

구분(인식) → 샘플링 → 패턴 파악 → 조정(도출)

의 과정으로 답을 찾습니다. 여러번 숙달하면 모르는 문제도 좀 더 쉽게 답을 찾을 수 있게 됩니다.

image

2개의 좋아요