가장 많이 반복되는 문자열 찾기 + visualize code

김민아·2022년 7월 11일
0

Python Tutor의 visualize code
Python Tutor의 visualize code

mostFrequentLetter

입력받은 문자열(word)에서 가장 많이 반복되는 문자(letter)를 출력한다.

  • 문자열은 공백을 포함할 수 있으며, 공백은 횟수에서 제외한다.
  • 가장 많이 반복되는 문자가 여러개일 경우, 가장 먼저 횟수에 도달한 문자를 반환한다.

의사코드 작성

// 문자와 갯수를 저장할 객체를 생성한다.

// 문자열의 모든 공백을 제거한다. 
// 빈 문자열일 경우 ''를 반환한다.

// 문자열을 반복하면서 
// 문자가 객체에 없으면 
	// 문자를 키로, 값은 문자의 횟수, 초기값으로 0을 할당한다. 
// 문자를 키로 갖는 값을 카운트 +1 한다. 

// 객체에 가장 많이 사용한 문자열을 담는다. 
// 문자의 카운트-업한 값을 가장 많이 사용한 문자열의 횟수와 비교한다. 
	// 문자의 횟수가 더 크면 가장 많이 사용한 문자열에 문자를. 
	// 가장 많이 사용한 문자열 횟수에 문자의 값을 넣는다. 
// 가장 많이 사용된 문자를 반환한다.

코드 작성

function mostFrequentCharacter(word) {
  let obj = {};
  let str = word.replace(/\s+/g, '')

  if (str === '') {
      return ''
  }

  for (let value of str) { 
    if (obj[value] === undefined) {
          obj[value] = 0;
    }
    obj[value]++; 

    if (obj['preq'] === undefined ) { 
      obj['preq'] = value
    } else if (obj[value] > obj[obj['preq']]) { 
      obj['preq'] = value
    }
  }

  return obj['preq'];
}
let result = mostFrequentCharacter('b a - na n -a -  ')

개선이 필요한 부분

  • 전달받은 wordfor문 들어가기 전에 공백제거를 시도했다. replaceAll는 브라우저에서 콘솔에서는 작동했지만 코플릿이나 visualize code에서는 작동하지 않았다.
  • replace도 테스트 중 ‘word.replaceAll is not function’라는 typeError가 날 때가 있었다.
  • 결과적으로 replace 말고 forcontinue를 사용해 공백을 제외하기로.
  • 객체에 ‘preq’ 키에 가장 많이 사용된 letter를 담았는데, obj[obj['preq']] “객체 중 ‘preq’의 값을 키로 가지고 있는 값”과… 이런식으로 풀이가 되는 것이 복잡하다.
  • obj['preq']의 초기값을 for문 안에 설정하는 것이 불필요하다.

개선된 코드

function mostFrequentCharacter(word) {
  let obj = {}
  let mostFrequentLetter = ''
  let mostFrequentCount = 0
  
  for (let letter of word) {
    if (letter === ' ') {
      continue
    }
  
    if (obj[letter] === undefined) {
      obj[letter] = 0
    }
    obj[letter]++
  
    if (obj[letter] > mostFrequentCount) {
      mostFrequentLetter = letter
      mostFrequentCount = obj[letter]
    }
  
  }
  return mostFrequentLetter
}

let result = mostFrequentCharacter('b a - na n -a -  ')

Visualize code

debugger; 의 과정을 시각적으로 보여주는 사이트. 변수가 선언되고 할당되는 과정을 step by step으로 확인할 수 있다. javascript ES6로 확인이 가능하다. 링크
임베딩하면 미리보기에서는 잘 보이는데 게시하면 안나오는 듯


replace() 타입에러와 replaceAll() 호환성

주제에 벗어나서 포스팅이 너무 길어지는 것 같아 따로 분리했다. 링크


continue

continue 문은 현재 반복문에서 실행을 종료하고 반복문의 처음으로 돌아가여 반복문의 다음 코드를 실행한다. break와 차이는 break는 반복문for, while을 완전히 빠져나오는 반면, continue는 해당 루프를 빠져나와 다음 루프를 시작한다.

  • while문일 경우 해당 루프에서 while 조건부로 점프한다.
  • for문일 경우 업데이트 표현식(증감식)으로 점프한다.

재미있는 건 continue 뒤에 label 이름이 붙을 수 있고, 이 경우 label로 점프한다.

출처

continue | MDN

0개의 댓글