소소한 개발 공부
[프로그래머스 | C#] 가장 가까운 같은 글자 LastIndexOf 본문
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
가장 마지막으로 발견되는 char 문자의 위치를 반환한다.
만약에 해당 char 문자가 없다면 -1을 반환한다.
이때 문자의 위치 인덱스는 0부터 시작해 string.Length-1 까지가 된다.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 물음표 ?? / ??= / ?. / ? (0) | 2023.02.02 |
---|---|
[프로그래머스 | C#] 과일 장수 Sort (2) | 2023.02.01 |
[프로그래머스 | C#] 크기가 작은 부분 문자열 TryParse (0) | 2023.01.29 |
[C#] 진법에 따른 숫자 리터럴 (0) | 2023.01.26 |
[C#] stopwatch 시간 측정 (0) | 2023.01.25 |