본문 바로가기
Algorithm

99클럽 코테 스터디 2일차 TIL - 문자열 분석 (백준 10820 / JavaScript)

by 륜곰 2025. 4. 2.

오늘의 문제 링크

 

⭐ intro : 문제를 생각해나간 방식

우선 문제를 이해(라는 이름의 해석)해보려고 읽어 내려갔다. 문장들을 하나씩 순회하면서, 그 문장에 걸리는 요소들 각각이 소문자라면 첫번째 배열값에 1을 더해주고, 차례대로 대문자, 숫자, 공백일 경우 해당 값에 해당되는 위치에 1씩 더해주는 문제. 문제 이해하는데는 무리는 없었다. 

 

 풀이과정

일단 첫번째 배열값인 This is String 값 하나부터  해쳐나가보기 시작했다. 이 문장에는 소문자가 10개, 대문자가 2개, 숫자는 0개, 공백은 개행문자 제외 2개가 들어가 있다.

  // input[0] = This is String
  const result = [0, 0, 0, 0];
  for (let i of input[0]) {
    if (/[a-z]/.test(i)) result[0]++;
    else if (/[A-Z]/.test(i)) result[1]++;
    else if (/[0-9]/.test(i)) result[2]++;
    else if (/[ ]/.test(i)) result[3]++;
  }
  console.log(result); // [ 10, 2, 0, 2 ]

여기서 알아야할 개념은 es6이후에서 추가된 새로운 for 반복문인 for in, for of, 정규표현식 적용 방법이 필요하다. for in 같은 경우  '객체'에서 열거 가능한 값들의 갯수를 뽑아내눈다고 생각하고, 개인적으로 for index라고 생각해서 외우면 좀 더 직관적으로 외워지는듯 하다. 나머지 for of는 반복가능한 '객체' 이지만 반복가능한 객체 안에 "배열"도 포함이 가능하다. 따라서 보편적으로 배열 값을 반복할때도 사용한다고 생각하면 편하다.

 위 예제에서는 input[0] 요소인 This is String 값을 하나하나씩 순회해보도록 하기 위하여 for of 문장을 써두었고, T,h,i,s, ,i,s, ,S,t,r,i,n,g 이렇게 하나하나 값을 비교하기 위해서 조건문과 함께 정규표현식과 test할 요소인 test(i)값들을 하나씩 비교해서, result값에 대응하는 요소에 +1씩 더해주도록 했다.

 마지막 공백부분에서 살짝 헷갈렸었는데, 간단히 [ ]요렇게 빈칸만 표시해두어도 문제 없이 잘 작동했었다.

 

 

이후로는 해당 요소뿐 아니라 모든 input객체 안에 있는 요소들을 순회해줘야 하므로 이 요소들을 반복문으로 한번 더 묶어주었다.

  for (let i in input) {
    const result = [0, 0, 0, 0];
    for (let j of input[i]) {
      if (/[a-z]/.test(j)) result[0]++;
      else if (/[A-Z]/.test(j)) result[1]++;
      else if (/[0-9]/.test(j)) result[2]++;
      else if (/[ ]/.test(j)) result[3]++;
    }
    console.log(result);
  }

 앞서 반복문의 변수를 i로 써두었었으나 중복 반복문의 순서도에 의거하여 상위 반복문 변수는 i, 후순위 반복문 변수는 j로 치환하였다. 이 코드를 보면 상단 input[0]에서 input[i]로 바뀐것을 확인 가능하고, 열거 가능한 값의 갯수를 뽑아낼 수 있는 for in 반복문으로 묶어서 모든 객체가 하나씩 순회해서 결과값을 도출하도록 만들었다.

 하지만 이렇게 만들면 뭔가 애매한 결과값이 나오게 된다....

 

// console.log(result);
[ 10, 2, 0, 2 ]
[ 0, 10, 1, 8 ]
[ 5, 6, 0, 16 ]
[ 0, 8, 9, 0 ]

 우리가 원하는 결과값은 이중배열의 형태도 아니고, ',' 쉼표가 존재하지 않는, a b c d 이런 형태의 값을 만들어야 하는데, 자바스크립트에서는 간단히 'join()' 메서드로 이 문제를 해결할 수 있다. join(params) 안에 들어있는 params값으로 연결되어있는 모든 요소들을 묶어버리는 기능이다. 그래서 다음과 같이 result.join(" ")으로 설정해두면 이윽고 우리가 원하는 값을 얻을 수 있게 된다.

 

// console.log(result.join(" "));
10 2 0 2
0 10 1 8
5 6 0 16
0 8 9 0

 

 

사소한 실패가 몇번 있었으나, 결과적으로 맞게 되었다.(짝짝)

 

 

 제출답안

function solution(input) {
  for (let i in input) {
    const result = [0, 0, 0, 0];
    for (let j of input[i]) {
      if (/[a-z]/.test(j)) result[0]++;
      else if (/[A-Z]/.test(j)) result[1]++;
      else if (/[0-9]/.test(j)) result[2]++;
      else if (/[ ]/.test(j)) result[3]++;
    }
    console.log(result);
  }
}
solution(input);

 공부했던 개념들