본문 바로가기

알고리즘구현능력/문제해결능력

알고리즘 토이 문제 2. 중복되지 않는 문자를 반환하는 문제.

firstNonRepeatedCharacter라는 함수가 있다. 그 함수의 input과 아웃풋은 다음과 같다..

firstNonRepeatedCharacter('ABA'); // => 'B'

firstNonRepeatedCharacter('AACBDB'); // => 'C'

두번이상 나오는 문자를 제외한 하나의 문자를 반환한다.

만약에 한번만 나오는 문자가 있다면.. 맨 처음에 나온 문자를 반환한다.

필자는 이 문제를 두가지 방법으로 구현했다.

첫번쨰는 string을 하나의 문자가 담긴 배열구조로 만든다음에.. 그것을 sort시킨다음에 풀었다. 사실 이방법은 좀 오류가 있엇어야 됐을지도 모르겠다. 왜냐하면 한번만 나오는 문자가 있다면 맨 처음에 나온 문자가 호출인데 .. .sort시키면서 그 첫번쨰 문자가 뒤에 문자보다 알파뱃순으로 뒤에 있을수도 있기 떄문이다. 

암튼 이방법은 

// 1. 처음하나가 값일떄..

// 2. 중간에 있을떄

// 3 .마지막에 있을떄...

세가지 사례가 있는데 

모르겠으면 밑의 코드를 보면서 이해해라.

더보기
1
2
3
4
5
6
7
8
9
10
11
12
  let newArr = string.split("").sort();
  for(let i = 0 ; i < newArr.length;i++){
    if(i===0&&newArr[i]!==newArr[i+1]){
      return newArr[i];
    }
    else if(i<=newArr.length-1&&newArr[i-1]!==newArr[i]&&newArr[i+1]!==newArr[i]){
       return newArr[i];
    }
    else if(i===newArr.length-1&&newArr[i-1]!==newArr[i]){
       return newArr[i];
    }
  }
cs

처음값과 뒤에값이 다를떄..
중간값과 앞뒤의 값이 다를떄...
맨끝의 값과 바로 앞의 값이 다를떄.. 코드로 분석하면 다음과 같다..

두번쨰 방법을 소개하겠다.

하나의 객체타입으로 담는 것이다. 문자열의 문자하나하나씩 돌려서 객체에 값이 없으면 0으로 초기화한다음 1을 추가하고 있다면
계속 value를 하나씩 더하는 것이다.
그렇게 돌린다음에 for문으로 돌려서 1이 나오는 가장 첫번쨰 key값을 리턴하면 된다.

답은 아래에 있다..

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
  let object = {};
  //그럼 위에서 제가 적었던 배열로 만들어서 푸는 방법을 생각해보자.
  for(let i=0;i<string.length;i++){
     if(!object[string[i]]){
         object[string[i]] =  0;
     }
     object[string[i]]++;
  }
  for(let key in object){
    if(object[key]===1){
      return key;
    }
  }
cs

모르겠으면 추가 질문을 댓글로 이야기 해주길 바란다.