[프로그래머스] Lv.0 한 번만 등장한 문자 JavaScript

Janet·2023년 4월 10일
0

Algorithm

목록 보기
131/314

문제 설명

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.


제한사항

  • 0 < s의 길이 < 1,000
  • s는 소문자로만 이루어져 있습니다.

입출력 예

sresult
"abcabcadc""d"
"abdc""abcd"
"hello""eho"

입출력 예 설명

입출력 예 #1

  • "abcabcadc"에서 하나만 등장하는 문자는 "d"입니다.

입출력 예 #2

  • "abdc"에서 모든 문자가 한 번씩 등장하므로 사전 순으로 정렬한 "abcd"를 return 합니다.

입출력 예 #3

  • "hello"에서 한 번씩 등장한 문자는 "heo"이고 이를 사전 순으로 정렬한 "eho"를 return 합니다.

문제풀이

💡 문제풀이 과정

  • 답안 1번: 주어진 문자열 s의 문자들 마다 몇 번씩 카운트 되는지 반복문과 new Set()을 이용하여, 2차원 배열의 형태로 담아서 풀이하였다. 하지만.. 이러한 방식은 오브젝트를 이용 했다면 더 간단했던 문제라 답안 2번도 참고할 것.
  • 답안 2번: object를 이용하여 중복된 문자들을 카운팅하고 value가 1인 것을 반환한다.
  • 답안 3번: filtermatch정규표현식을 사용한 다른 사람의 풀이이다. 주어진 문자열 s의 요소들과 […s]의 원소들 중 매칭되는 것의 length가 1인 경우를 배열 형태로 반환하면 오름 차순 정렬하고 문자열로 이어 붙여 리턴한다.

✅ 답안 #1

function solution(s) {
  let arr = [];
	
  [...new Set(s)].sort().map((v) => arr.push([v, 0]));
	// s를 중복되지 않은 배열의 형태로 복사 후 2차원 배열 형태로 arr에 담는다.
	// ex. [[s의 원소1, 카운트할 수], [s의 원소2, 카운트할 수], ...]

  for (let i of s) arr.map((v) => (v[0] == i ? v[1]++ : 0));
	// s의 원소가 arr의 원소[0]가 같으면 arr의 원소[1]에 1씩 더한다.

	return arr.map((v) => (v[1] == 1 ? v[0] : "")).sort().join("");
	// 카운팅된 수가 1이면 해당 문자들을, 아니면 빈 문자열을 배열 형태로 반환.
	// 오름 차순 정렬 후 배열 형태 문자열로 연결하여 반환.
}

✅ 답안 #2

function solution(s) {
  const obj = {};
  for (const i of s) obj[i] = (obj[i] || 0) + 1;
	// s의 문자들을 객체 key값으로 추가, value: 기본값 0이고 key값 중복될 때마다 1씩 더함.
	
  return Object.keys(obj)
		.filter((key) => obj[key] == 1).sort().join("");
		// 객체 value가 1인 것만 배열 형태로 반환 후 정렬 및 문자열로 리턴.
}

✅ 답안 #3

function solution(s) {
  return [...s]
    .filter((char) => s.match(new RegExp(char, "g")).length == 1)
    .sort()
    .join("");
}
profile
😸

0개의 댓글