[Lv.1] 문자열 나누기 [프로그래머스_코딩테스트]
https://school.programmers.co.kr/learn/courses/30/lessons/140108
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
using System;
public class Solution
{
/// <summary>
/// 문자열 나누기
/// https://school.programmers.co.kr/learn/courses/30/lessons/140108
/// </summary>
public int solution(string s)
{
int answer = 0;
// 이전 것 체크
char? firstAlphabet = null;
// 이전 같은 알파벳 연달아 나온 개수 합산
int sameCount = 0;
for (int i = 0; i < s.Length; i++)
{
// 처음 단어인 경우 or 새로 묶음이 시작되어 초기화가 된 경우
if (firstAlphabet == null)
{
firstAlphabet = s[i];
sameCount++;
// 초기화 순간 하나의 묶음 생긴걸로 인정
answer++;
continue;
}
// 현재 읽어온 알파벳
char current = s[i];
// 연달아 같은 알파벳 나온 경우
if (firstAlphabet == current)
{
sameCount++;
}
// 이전과 다른 알파벳 나온 경우
else
{
sameCount--;
}
// 같은 알파벳과 다른 알파벳의 숫자가 동일하게 되는 순간(0) answer 카운트 증가 후 캐시한 알파벳 초기화
if (sameCount == 0)
{
firstAlphabet = null;
}
}
return answer;
}
}
/// <summary>
/// C# 7.3
/// </summary>
internal class Program
{
public static void Main(string[] args)
{
var sl = new Solution();
Console.WriteLine(sl.solution("aaabbaccccabba"));
}
}
문제를 처음 읽었을 때 한글인데도 독해를 실패하여 챗gpt에게 예시 풀이를 한 번 더 해달라고 한 후에야 해석을 완료하였다.
문제가 길게 써져 있는 와중에 난해하게 써져있는 부분이라 생각되는 부분은 "처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다" 라는 부분에서 뭔가 와닿지 않는 느낌이었달까.. 문제를 좀 더 자주 다루면서 독해력을 키워봐야 하려나 싶기도 했다.
일단 문제를 다시 해석해 보면 결국 문자열을 차례대로 읽으면서 처음으로 마주친 알파벳과 같은 개수의 다른 알파벳들을 마주치면 멈추고 묶음으로 묶어서 answer count를 증가시킨다는 문제로 해석
그래서 생각했던 것은 먼저 당연하지만 처음 마주친 단어의 count를 위한 int 변수, 그리고 처음 마주친 알파벳을 캐시하기 위한 char였다. (필자는 문자를 아직 읽지 않은 상태를 체크하기 위해서 null로 두고 자료형을 nullable로 바꿔서 사용했다. 다만 이렇게 nullable을 쓰는 부분이 chatgpt 의견으로는 나중에 사용하게 되는 부분에 따라서 boxing, unboxing이 생길 수 있는 경우가 있어서 char는 0으로 초기화 하고 bool형 변수를 하나 더 추가해서 isFirstAlphabet 과 같은 형태를 추가하는 방식을 조언하였다. 사실 지금 문제에서 쓰이는 부분은 그렇게 boxing과 unboxing이 생길만한 부분은 없기 때문에 큰 상관은 없긴 하지만 실제 라이브 서비스를 하면서 개발을 할 때는 주의해서 작업을 하면 좋을 듯 하다는 생각이 든다)

추가로 그렇게 해서 chatgpt의 피드백을 받은 부분은 내가 사용하였던 sameCount라는 변수명보단 balance를 사용하기와 위의 nullable사용 안하고 해결, continue를 쓰는 대신 else 구문으로 묶기 피드백을 적용한 코드는 아래와 같다.
public int solution(string s)
{
int answer = 0;
char firstChar = '\0';
int balance = 0;
bool isNewGroup = true;
foreach (char c in s)
{
if (isNewGroup)
{
firstChar = c;
balance = 1;
answer++;
isNewGroup = false;
}
else
{
balance += (c == firstChar) ? 1 : -1;
if (balance == 0)
{
isNewGroup = true;
}
}
}
return answer;
}
확실히 코드가 깔끔해진 느낌이 들기에 코딩테스트 문제를 풀어보고 gpt에게 피드백을 구하면서 공부를 해보는 것은 나름 도움이 많이 되는 것 같다.