728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
알파벳 소문자로만 이루어진 어떤 문자열에서, 2회 이상 나타난 알파벳이 2개 이상의 부분으로 나뉘어 있으면 외톨이 알파벳이라고 정의합니다.
1. 문자열 "edeaaabbccd" 를 예시로 들어보면,
- a는 2회 이상 나타나지만, 하나의 덩어리로 뭉쳐있으므로 외톨이 알파벳이 아닙니다.
"ede(aaa)bbccd" - b, c도 a와 같은 이유로 외톨이 알파벳이 아닙니다.
- d는 2회 나타나면서, 2개의 부분으로 나뉘어 있으므로 외톨이 알파벳입니다.
"e(d)eaaabbcc(d)" - e도 d와 같은 이유로 외톨이 알파벳입니다.
2. 문자열 "eeddee" 를 예시로 들어보면,
- e는 4회 나타나면서, 2개의 부분으로 나뉘어 있으므로 외톨이 알파벳입니다.
"(ee)dd(ee)" - d는 2회 나타나지만, 하나의 덩어리로 뭉쳐있으므로 외톨이 알파벳이 아닙니다.
"ee(dd)ee"
문자열 input_string이 주어졌을 때, 외톨이 알파벳들을 알파벳순으로 이어 붙인 문자열을 return 하도록 solution 함수를 완성해주세요. 만약, 외톨이 알파벳이 없다면 문자열 "N" 을 return 합니다.
Solve
- 같은 문자가 연속되어 나와도 두 부분으로 나누어지면 외톨이 알파벳이기 때문에, 연속으로 된 알파벳의 중복을 먼저 제거해 주었습니다.
- 중복을 제거해주었다면 알파벳의 등장 횟수를 세어주기 위해 hash라는 객체를 만들어 갯수를 카운트 하였습니다.
- 2개이상 나온 경우 외톨이 알파벳이기 때문에 배열에 담고, 정렬해준 후 join함수를 이용해 문자열로 출력하였습니다.
Code
function solution(input_string) {
// 연속되는 문자를 먼저 제거
const arr = [input_string[0]];
for(let i = 1; i < input_string.length; i++) {
if(arr[arr.length-1] !== input_string[i]) arr.push(input_string[i]);
}
const hash = {};
for(let i = 0 ; i < arr.length; i++) {
if(!hash[arr[i]]) hash[arr[i]] = 0;
hash[arr[i]]++
}
const answer = [];
const keys = Object.keys(hash);
keys.forEach(key => {
if(hash[key] >= 2) answer.push(key);
})
answer.sort();
return answer.length === 0 ? "N" : answer.join('');
}
'Programmers > JS' 카테고리의 다른 글
[Programmers / JS] PCCP 모의고사 #2. 실습용 로봇 (0) | 2023.04.10 |
---|---|
[Programmers / JS] PCCP 모의고사 #1. 유전법칙 (0) | 2023.04.08 |
[Programmers / JS] Lv.3 징검다리 건너기 (0) | 2023.04.06 |
[Programmers / JS] Lv. 3 입국심사 (0) | 2023.03.03 |
[Programmers / JS] Lv 2. 연속 부분 수열 합의 개수 (0) | 2023.02.14 |