코딩테스트/프로그래머스

[코딩테스트 입문] Day 15 한 번만 등장한 문자 (JavaScript)

Kim Minki 2023. 2. 1. 17:51

한 번만 등장한 문자

문제 설명

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

제한사항

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

입출력 예

s result
"abcabcadc" "d"
"abdc" "abcd"
"hello" "eho"

입출력 예 설명

입출력 예 #1

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

입출력 예 #2

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

입출력 예 #3

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

나의 풀이

function solution(s) {
    let set = new Set(s)
    let sArr = Array.from(set)
    let idx = new Array(sArr.length)
    idx.fill(0)
    for(let i = 0; i < sArr.length; i++){
        for(let str of s){
            if(sArr[i] === str){
                idx[i] += 1;
             }
        }
    }
    let answer = []
    for(let i = 0; i < idx.length; i++){
        if(idx[i] === 1){
            answer.push(sArr[i])
        }
    }
    answer = answer.sort()
    answer = answer.join('')
    return answer
}

풀이 설명

  • 기본적인 아이디어는 문자열 s를 구성하는 문자들의 빈도를 계산하여 빈도수가 1인 문자만 따로 저장하는 것이다.
  • 문자들의 빈도를 계산하기 위해 입력으로 들어온 문자열 s의 중복을 제거해 배열로 저장한 sArr
  • 문자들의 빈도를 저장하기 위해 sArr만큼의 길이를 가지고, 모든 요소를 0으로 초기화한 배열 idx
  • for 문과 for of 문을 통해 문자열 s안의 문자들을 차례대로 중복을 제거한 배열 sArr의 요소들과 비교하여 그 값이 일치할 때마다 배열 sArr의 해당 index에 해당하는 배열 idx안의 요소를 1씩 더해준다.
  • 그 이후 다시 for 문을 통해 문자들의 빈도수가 저장된 배열 idx의 요소가 1인 경우 배열 idx와 같은 인덱스의 배열 sArr의 요소를 정답을 저장하기 위한 배열 answer에 저장한다.
  • 배열 answersort()메서드를 통해 사전 순으로 정렬한 뒤 join()메서드를 통해 배열을 문자열로 변환하고, 그 값을 반환한다.

indexOf()lastIndexOf() 메서드

  • indexOf()메서드는 해당 요소를 찾을 수 있는 인덱스 중 가장 첫 번째 인덱스를 반환하고, 존재하지 않으면 -1을 반환
  • lastIndexOf()메서드는 해당 요소를 찾을 수 있는 인덱스 중 역순으로 가장 첫 번째 인덱스를 반환하고, 존재하지 않으면 -1을 반환
  • 이 두 메서드를 이용하면 찾으려는 요소가 그 문자열에서 1번만 등장하는지 아닌지 여부를 알 수 있다.
    function solution(s) {
      let set = new Set(s)
      let strArr = [...set]
      strArr.sort()
      let answer = ''
      for (let str of strArr){
          if(s.indexOf(str) === s.lastIndexOf(str)){
              answer += str
          }
      }
      return answer;
    }
  • 문자의 빈도 수를 계산하기 위해 비교 연산을 하기에 앞서 비교 대상을 만들기 위해 문자열 s에서 중복을 제거한 배열 strArr을 생성하는 것까지는 처음 풀이와 같다.
  • 하지만 그 이후에, indexOf() 메서드와 lastIndexOf() 메서드를 이용하여 배열 strArr안의 원소가 문자열 s안에서의 첫번째 인덱스와 마지막 인덱스를 서로 비교하고, 그 값이 같다면 그 빈도가 한 번임을 알 수 있다.
  • 이를 이용하면 처음 풀이와 달리 비교적 간단하게 답을 찾을 수 있다.