문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.
입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.
입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.
오늘도 뭔소린지 모르겠네요!!
문제 자체를 이해하기 너무 어려웠어요ㅜㅜ 문해력 부족하다는 게 이런건가...
기존에 올라왔던 질문을 통해 파악해봤어요.
요점은 횟수 라는 부분이더라구요.
입출력 예 #3번을 보자면
빨간색 숫자는 문자열의 순서입니다.
파란색 숫자는 문제상의 x가 나온 횟수입니다.
초록색 숫자는 문제상의 x 대조 문자(여기서 y라고 하겠습니다)가 나온 횟수입니다.
aaabbaccccabba의 경우 첫번째 문자, 즉 a = x입니다.
a가 1, 2 ,3 회 나온 후
a가 아닌 문자, 즉 대조 문자 y 가 1, 2회 나오고,
다시 x가 4회차 나오고,
대조 문자 y가 3, 4회 나옵니다.
x의 등장 회차 = y의 등장 회차일 때 멈추고, 이전까지의 문자열을 분리합니다.
(여기서는 a 4회차, y 4회차인 aaabbacc에서 멈추고 분리)
여기서 다시 시작합니다.
x는 이제 c가 됩니다.
c가 1, 2회 나오고,
c가 아닌 문자, 즉 대조 문자 y 가 1, 2회 나옵니다.
x의 등장회차 = y 의 등장 회차일 때 멈추니까,
여기서는 c 의 등장회차인 2회차 = y 의 등장회차인 2회차일때의 문자 b에서 멈추고, 이전까지의 문자열을 분리합니다.
(ccab)
그리고 또 반복합니다.
b 가 1회, a가 1회로 각각 동일하기에,
여기서 멈추고 문자열을 분리합니다.
(ba)
마지막으로 분리된 문자열 덩어리들은 총 3개가 됩니다
예시 #2처럼 "abracadabra"의 경우를 볼까요.
x의 등장회차가 y의 등장회차와 같은 경우를 나누면
ab
ra
ca
da
br
그리고 a가 남습니다.
이 경우 마지막 a또한 문자열 덩어리 총합에 포함시켜줘야합니다.
그러면 분리된 문자열 덩어리들은 6개가 됩니다.
전혀 감이 오지 않아서!
다른 분들의 해설을 많이 참고했습니다.
function solution(s) {
let answer = 0;
let firstChar = "";
let equalCount = 0;
let unEqualCount = 0;
for(let i = 0; i < s.length; i++) {
if(!firstChar) {
firstChar = s[i];
}
if(firstChar == s[i]) {
equalCount += 1;
} else {
unEqualCount += 1;
}
if (equalCount == unEqualCount) {
answer += 1;
equalCount = unEqualCount = 0;
firstChar = "";
}
}
if(firstChar.length > 0) {
answer += 1;
}
return answer
}
분해한 문자열의 개수를 뜻하는 answer의 초기값을 0으로 줍니다.
첫번째 문자(firstChar)를 빈 string으로 주고,
("aaabbaccccabba"를 예로 들게요)
첫번째 문자 a가 문자열 "aaabbaccccabba"의 문자를 차례대 순회하며 비교를 진행할건데,
a가 "aaabbaccccabba"순서대로 비교하면서 문자가 같은 경우(x의 등장회차)를 1씩 더해줍니다.
근데 어디에 더해줄것인가? 문자를 비교해서 같은 경우를 equalCount라는 변수에 담아줄겁니다. 초기값은 0.
그리고 문자가 다를 경우인 y의 등장회차도 1씩 더해줍니다.
어디에? 문자를 비교해서 다른 경우를 unEqualCount라는 변수에 담아줍니다. 마찬가지로 초기값은 0.
그리고 equalCount(x 등장회차) = unEqualCount(y 등장회차)가 같으면
문자열 덩어리 answer을 1씩 더합니다.
다시 equalCount와 unEqualCount는 0으로 리셋해주고,
firstChar도 빈 string으로 바꿔줍니다.
이렇게 적고보니 리액트 쓰는 거 같네여 ㅎ
마지막으로 첫번째 문자가 남았는데 비교할 문자가 없는 경우에도
문자열 덩어리로 간주하여 answer에 1을 더합니다.
예시로 넣어서 console.log 찍어봤습니다.
확인용으로 만든 거라서 솔루션 코드와는 약간 다릅니다.
after finish for loop의 경우, 문자열 순회를 끝나고 나서 비교할 문자가 없는 잔여 문자를 표시하기 위함입니다.
문자열이 "abracadabra"라면
마지막에 남는 비교문자열이 없는 첫번째 문자 a가 남고,
그것을 count 에 추가하여 총 6개의 문자열 덩어리가 나오게 됩니다.
참고한 글
https://leejams.github.io/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%98%EB%88%84%EA%B8%B0/
[프로그래머스] 문자열 나누기 - JavaScript | LeeJam
개발자 리잼의 코딩테스트 풀이 블로그 💻 @github.
leejams.github.io
function solution(s) {
let answer = 0;
let x = s[0];
let equalCount = 0;
let unEqualCount = 0;
for(let i = 0; i < s.length; i++) {
if(x == s[i]) {
equalCount += 1;
} else {
unEqualCount += 1;
}
if (equalCount == unEqualCount) {
answer += 1;
equalCount = unEqualCount = 0;
x = s[i + 1];
}
}
if(x !== undefined && x.length > 0) {
answer += 1;
}
return answer
}
비교할 첫번째 문자 x를 s의 0번째 문자로 초기값을 지정한 후,
문자열 분리 시 i번째 + 1하여 다시 초기값을 세팅하는 방법으로도 할 수 있습니다.
그러면 "abracadabra"의 경우 처럼 마지막 a가 문제가 생기는데요,
이 때에는 x가 undefined가 아님과 동시에 x가 있다면- 으로 처리 가능합니다.
[프로그래머스] JS 코딩테스트 lv.1 크기가 작은 부분 문자열 (0) | 2023.01.03 |
---|