소소한 개발 공부

[프로그래머스 | C#] 가장 가까운 같은 글자 LastIndexOf 본문

프로그래밍/C#

[프로그래머스 | C#] 가장 가까운 같은 글자 LastIndexOf

이내내 2023. 1. 30. 00:53

https://school.programmers.co.kr/learn/courses/30/lessons/142086

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

문자열이 주어졌을 때 문자열 내 각 문자를 기준으로 앞에 나온 같은 글자 중 가장 가까운 글자와의 거리를 구해 배열로 반환하는 문제이다.

이때 앞에 글자 중에 현재 위치의 글자가 없다면 -1을 배열에 넣는다.

 

"hello"를 예로 들어보자

인덱스 0 1 2 3 4
문자 h e l l o

0번째 문자 h는 그 앞 문자열 ""에 h가 존재하지 않아 -1을 배열에 넣는다.

1번째 문자 e는 그 앞 문자열 "h"에 e가 존재하지 않아 -1을 배열에 넣는다.

2번째 문자 l은 그 앞 문자열 "he"에 l이 존재하지 않아 -1을 배열에 넣는다.

3번째 문자 l은 그 앞 문자열 "hel"에 l이 존재하고 가장 마지막 l의 위치 2와 3의 거리가 1이므로 1을 배열에 넣는다.

4번째 문자 o은 그 앞 문자열 "hell"에 o이 존재하지 않아 -1을 배열에 넣는다.

결과는 [-1, -1, -1, 1, -1] 이 된다.

 

코드
namespace ConsoleApplication1
{
    public class 가장_가까운_같은_글자
    {
        // static void Main()
        // {
        //     int[] answer = solution("foobar");
        //     foreach (var VARIABLE in answer)
        //     {
        //         Console.WriteLine(VARIABLE);
        //     }
        // }
        
        public static int[] solution(string s) {
            int[] answer = new int[s.Length];
            for (int index = 0; index < s.Length; index++)
            {
                int pos = s.Substring(0, index).LastIndexOf(s[index]);
                answer[index] = pos != -1 ? index - pos : -1;
            }
            return answer;
        }
    }
}

solution 메서드를 보면,

1. 먼저 차이 값을 넣을 배열을 선언 및 할당하고, for문을 문자열의 길이만큼 반복하는 것을 볼 수 있다.

2. for문 안에서는 현재 확인하고 있는 문자의 앞을 부분문자열로 만들어 그 앞에 가장 마지막으로 존재하는 같은 문자의 위치를 찾는 LastIndexOf를 이용해 같은 문자의 위치를 찾는다.

=> LastIndexOf : 현재 문자 위치 앞에 같은 문자가 있는지 찾는데 그 중 가장 마지막으로 있는 것의 위치를 반환

3. 찾은 위치가 -1이 아니라면 가장 가까운 같은 문자를 찾은 것이므로 현재 문자와의 거리를 구한다.

만약 찾지 못했다면 LastIndexOf는 -1을 반환하기 때문에 pos == -1이 된다. 이를 해답 배열 answer에 삽입한다.

중요한 점 LastIndexOf

https://learn.microsoft.com/ko-kr/dotnet/api/system.string.lastindexof?view=net-7.0 

 

String.LastIndexOf 메서드 (System)

이 인스턴스에서 마지막으로 발견되는 지정된 유니코드 문자 또는 문자열의 0부터 시작하는 인덱스 위치를 보고합니다. 이 인스턴스에 해당 문자나 문자열이 없으면 이 메서드는 -1을 반환합니

learn.microsoft.com

LastIndexOf(Char)

가장 마지막으로 발견되는 char 문자의 위치를 반환한다.

만약에 해당 char 문자가 없다면 -1을 반환한다.

이때 문자의 위치 인덱스는 0부터 시작해 string.Length-1 까지가 된다.