오늘의 학습 키워드
https://school.programmers.co.kr/learn/courses/30/lessons/140108
- 문자열나누기
- CS, 컴퓨터 구조 학습
공부한 내용 본인의 언어로 정리하기
문자답안
class Solution {
public int solution(String s) {
int answer = 0;
char x = s.charAt(0);
int xCount = 1;
int xNotCount = 0;
for (int i = 1; i < s.length(); i++) {
if (xCount == 0 && xNotCount == 0) {
x = s.charAt(i);
xCount = 1;
continue;
}
if (x == s.charAt(i)) {
xCount++;
} else {
xNotCount++;
}
if (xCount == xNotCount) {
answer++;
xCount = 0;
xNotCount = 0;
}
}
if (xCount != 0 || xNotCount != 0) { // 남은 문자열이 있다면 answer 추가
answer++;
}
return answer;
}
}
이 문제는 처음 조건을 읽었을 때는 바로 이해하기가 힘들었다. 그래서 주어진 예제와 조건을 반복적으로 읽으면서 파악했다.
- 일단 문자열의 첫 글자 x라 지정한다.
- 문자열을 처음부터 읽어나가며 x와 같은 문자가 나온 횟수와 다른 문자가 나온 횟수를 구한다.
- 이 두 횟수 동일해진 시점까지 문자열이 분리되며 이 부분문자열을 카운팅 한다.
- 다음 문자가 다시 x가 되며 위 과정을 반복한다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 문자가 없다면 없는대로 분리하고 종료한다.
위 과정을 코드로 직관적으로 옮기며 작성하였다.
첫글자에 대한 초기화를 우선 진행하고 두 번째 인덱스부터 반복문을 도는 방식으로 진행하였다.
x와 같은 문자와 다른 문자가 나오는 경우에 대한 카운팅 조건이다.
if (x == s.charAt(i)) {
xCount++;
} else {
xNotCount++;
}
다음 조건으로 두 카운팅이 같아지면 부분문자열 카운팅을 증가시키고 문자카운팅을 다시 0으로 초기화해 준다.
if (xCount == xNotCount) {
answer++;
xCount = 0;
xNotCount = 0;
}
그럼 다음 초기화된 조건에 따라 다음 x 변수를 초기화해 주는 코드로 작성하였다.
if (xCount == 0 && xNotCount == 0) {
x = s.charAt(i);
xCount = 1;
continue;
}
반복문 조건 코드는 문제의 조건이 완벽하게 맞았을 때는 문제가 없다. 하지만 위 조건 마지막인 ' 만약 두 횟수가 다른 상태에서 더 이상 읽을 문자가 없다면 없는 대로 분리하고 종료한다' 이 부분에 대해선 처리할 수 없다.
그렇기 때문에 반복문 종료 후에도 xCount와 xNotConut 변수의 값이 0이 아니라면 조건을 만족하지 못하는데 문자열이 끝나는 경우를 나타냄으로 마지막 부분문자열 카운팅 처리를 하고 종료시키게 된다.
if (xCount != 0 || xNotCount != 0) { // 남은 문자열이 있다면 answer 추가
answer++;
}
코드개선
다음 코드는 향상된 for문과 변수 단순화를 통해 개선한 코드이다. 기존 변수 xCount와 xNotConut를 하나의 변수 balance로 줄였고 해당 변숫값을 +,- 하면서 0 값이 될 때 같은 횟수이다.로 활용하였다.
class Solution {
public int solution(String s) {
int answer = 0;
char x = s.charAt(0);
int balance = 0;
for(char c : s.toCharArray()) {
if(balance == 0){
x = c;
}
if(x == c){
balance++;
}else {
balance--;
}
if(balance == 0) {
answer++;
}
}
if(balance != 0){
answer++;
}
return answer;
}
}
하지만 위 코드도 if(balance == 0) 조건이 위아래로 반복되는 구조로 되어 있어 가독성, 직관성이 떨어져 최종적으로 아래와 같이 개선하였다.
class Solution {
public int solution(String s) {
int answer = 0;
char x = s.charAt(0);
int balance = 0;
for (char c : s.toCharArray()) {
// 새로운 부분 문자열 시작 시 기준 문자 x 설정
if (balance == 0) {
x = c;
answer++; // 새 문자열이 시작되므로 answer 증가
}
// balance 업데이트
balance += (c == x) ? 1 : -1;
}
return answer;
}
}
- balance == 0일 때마다 새로운 부분 문자열이 시작되므로, answer++이 해당 시점에만 호출된다.
- balance 증감은 한 줄로 간소화하여, x와 같으면 증가하고 다르면 감소하게 만들었다.
- 이 방식은 마지막에 남은 부분 문자열 처리를 자동으로 포함하므로 if (balance != 0) 조건이 필요하지 않다.
이렇게 수정하면 루프 구조가 간결해지고, balance 조건이 반복되지 않아 가독성이 높아진다.
오늘의 회고
3일 차 문제도 문자열에 대한 부분이다. 문제자체는 이해하면 푸는 데는 문제가 없었다. 그런데 조건을 쭉 나열해서 진행하다 보니 코드가 지저분해지고 읽었을 때 가독성이 떨어진다는 느낌을 받았다.
그래서 다른 사람의 문제 풀이를 참고하여 개선포인트를 잡아 코드를 다시 작성하는 과정을 해봤다. 코드테스트를 벗어나 코드를 간결하고 이해하기 쉽게 짜는 거 개발자에서 중요한 점이기 때문에 앞으로도 이런 과정을 추가하여 진행해 봐야 될 것 같다.
'TIL' 카테고리의 다른 글
[TIL-24/11/02] 99클럽 코테 스터디 6일차 TIL - 할리갈리 (1) | 2024.11.02 |
---|---|
[TIL-24/11/01] 99클럽 코테 스터디 5일차 TIL - 모스 부호 (0) | 2024.11.01 |
[TIL-24/10/31] 99클럽 코테 스터디 4일차 TIL + 숫자 문자열과 영단어, CS 학습 (1) | 2024.10.31 |
[TIL-24/10/29] 99클럽 코테 스터디 2일차 TIL + 크기가 작은 부분 문자열, CS 학습 (1) | 2024.10.29 |
[TIL-24/10/28] 99클럽 코테 스터디 1일차 TIL + 문자열 내 p와 y의 개수, CS 학습 (1) | 2024.10.28 |