문제 2

모모·2021년 10월 30일
0

문제 복기

목록 보기
2/5

문제

문자열을 입력받아 문자열을 구성하는 각 문자를 키로 받아야 한다.
키에 대한 값은 각 문자가 해당 문자열에 등장하는 횟수이다.

function cntCha(str) {
  // 빈객체 만들어서 반복문으로 키를 할당한다
  // 또다른 반복문을 만든다 <= 이걸 먼저해보자
  // => 변수를 하나 선언해서 요소가 있으면 변수에 누적해서 누적값을 값으로
  let obj = {};
  // let count = 1;
  for(let x = 0; x < str.length; x++){
    let count = 0;
    for (let y = 0; y < str.length; y++){
      if (str[x] === str[y]){
        count+= 1
      }
    }
    obj[str[x]] = count;
    // y선언한 for문 벗어나면 count는 초기화 안되네
  }
  return obj
}

풀이 과정에서의 생각

우선 키와 값을 할당할 빈 객체를 선언한다.
키를 할당하기 위해 반복문으로 문자열의 각 요소를 차례대로 조회해야 한다.
값을 할당하기 위해서는 문자가 문자열에 등장하는 횟수를 구해야 한다. 따라서, 인덱스 번호 하나는 고정하고, 또다른 인덱스 번호가 순차적으로 증가하면서 서로 일치하는 지 확인해야 한다.
구한 키와 값을 빈 객체에 할당하고, 리턴한다.

문제를 단순화하기 위해 키를 먼저 구하여 객체에 할당하고, 따로 값을 할당하려했다.
하지만 키와 값을 따로 할당하기 위해서는 문자열과, 객체 타입에 더하여 배열까지 동원해야하므로 오히려 복잡해질 것이 우려되었다.

일단 값을 구하기 위해서는 이중 반복문을 사용해야 하는, 상대적으로 더 복잡성을 요구했기 때문에 코드를 먼저 작성했다. 이 과정에서 키와 값을 한 번에 추출할 수 있음을 예감했다. y가 반복되는 동안 x값은 잠시 고정되기 때문에 이를 내부 for문 밖, 외부 for문 안에만 사용하면 처음 의도한대로 순차적으로 키를 할당받을 수 있었다.

값을 구하는 반복문에는 문자의 등장횟수를 임시로 누적시킬 수 있도록 전역 변수로 count를 선언한 뒤, 조건과 일치하면 1씩 증가시켰다.

issue

실행 결과, 키는 순차적으로 잘 할당되었으나, 값이 계속 누적된듯한 결과가 나타났다.
x값이 바뀔때마다 count를 초기화시키려 했는데, 초기화가 안되고 계속 누적되고 있다는 의미였다.
이는 count를 전역 변수로 선언했기에 벌어진 일이라 생각하여 선언 위치를 for문 안으로 바꿔주었다.

어떤 for문 안에 위치시킬지 정해야 했는데 for문의 작동만 생각한다면 어디든 상관없었다. 하지만, 내부 for문에 위치하게 되면 키와 count를 동시에 추가하는 코드에서 count를 찾지 못하게 되었다. 따라서 외부 for문에 위치시켜 이를 해결했다.

count에 결과가 계속 누적되는 현상은 해결되었다. 하지만 값이 의도한 것보다 1씩 크다는 것을 발견했다.
이는 초기 count 값을 1로 선언했기 때문이었는데, 중복되는 문자가 없을 때 그 자체로 1의 값을 가진다고 생각했기 때문이었다. 하지만 반복문 안에서 문자가 스스로와도 일치하는 지를 확인하기 때문에 1이 더 큰 값이 결과로 리턴되었던 것이다. count를 0으로 선언함으로써 이를 해결했다.

0개의 댓글