[Lv.0] 문자열 밀기 [프로그래머스_코딩테스트] [문자열, 회전] [15분]
🔍 문제 요약
https://school.programmers.co.kr/learn/courses/30/lessons/120921
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문자열을 한칸씩 밀면서 끝에 있는 단어는 가장 좌측으로 다시 오게 하는 형식일 때, A에서 B로 문자열을 밀어서 만들기 위한 최소한의 횟수를 구하기. 구하지 못하는 경우는 -1
🧠 나의 접근 방식과 시행착오
문자열을 미는거에 대해서 직접 밀어서 원본을 수정하는 방법도 있겠지만 그러기에는 메모리를 많이 먹게 되거나 하는 케이스가 생길 것으로 판단하여, 필자는 StringBuilder라는 유용한 기능을 가져다 쓰기로 하였다. 해당 기능을 활용하여 A의 문자열의 길이만큼 반복문을 돌면서 밀기 위한 index를 증가시키면서 stringBuilder에 넣어보고 결과를 B와 비교해보는 방식을 사용. 14분 정도의 시간에 푼 문제로 lv0이라 그런지 역시 크게 어렵게 다가온 문제는 아니다. 풀이 코드는 아래에 첨부
using System;
using System.Text;
public class Solution
{
/// <summary>
/// 문자열 밀기
/// https://school.programmers.co.kr/learn/courses/30/lessons/120921
/// </summary>
public int solution(string A, string B)
{
int answer = -1;
var strBuilder = new StringBuilder();
for (int i = 0; i < A.Length; i++)
{
// strBuilder 비우기
strBuilder.Clear();
// 0부터 i까지
for (int j = A.Length - i; j < A.Length; j++)
{
strBuilder.Append(A[j]);
}
// 0 부터 끝 - i까지
for (int j = 0; j < A.Length - i; j++)
{
strBuilder.Append(A[j]);
}
if (B == strBuilder.ToString())
{
answer = i;
break;
}
}
return answer;
}
}
/// <summary>
/// C# 7.3
/// </summary>
internal class Program
{
public static void Main(string[] args)
{
var sl = new Solution();
var A = new string[] {"hello", "apple", "atat", "abc"};
var B = new string[] {"ohell", "elppa", "tata", "abc"};
for (int i = 0; i < A.Length; i++)
{
Console.WriteLine(sl.solution(A[i], B[i]));
}
}
}
✅ 풀이 코드
gpt에게 피드백을 받은 부분인데 정말 간편한 방식을 하나 알려줘서 기록차 남겨둔다. A를 2개를 붙인 문자열에서 IndexOf로 B라는 문자열을 찾는 방식.. 매우 간편하게 찾는 방식으로 실제로 문자열을 회전시키거나 하는 형태에서는 이러한 2개를 붙인다는 아이디어는 유용하게 쓸 수 있을 것 같다.
public int solution(string A, string B)
{
string doubled = A + A;
int index = doubled.IndexOf(B);
return (index < 0 || index >= A.Length) ? -1 : index;
}
🔄 정리
StringBuilder를 써서 푸는 방법도 있겠고, A를 doubled시킨 후 IndexOf를 해서 찾는 간결한 방식도 존재하는 것을 잘 숙지하면 좋을 것 같다.