CODE STATES 44/데일리 코딩(알고리즘)

[알고리즘]6 letterCapitalize, 7 convertListToObject, 8 convertDoubleSpaceToSingle

꼬드리 2023. 3. 23. 16:51

06_letterCapitalize

문자열을 입력받아 문자열을 구성하는 각 단어의 첫 글자가 대문자인 문자열을 리턴해야 합니다.

  • 단어는 공백으로 구분합니다.
  • 연속된 공백이 존재할 수 있습니다.
  • 빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.
function letterCapitalize(str) {
  let words = str.split(' ');

  for (let i = 0; i < words.length; i++) {
    if (words[i].length > 0) {
      words[i] = words[i][0].toUpperCase() + words[i].substr(1);
    }
  }

  str = words.join(' ');
  return str;
}

주어진 문자열을 우선 공백을 기준으로 두고 나누었고, words 변수에 담았습니다. 이후 공백은 길이가 0이기 때문에, 해당되지 않는 문자들만 바꿔주었습니다. 

split(' ')와 join(' ')를 적극 활용했다고 보면 되겠네요. 처음에 words[i].length가 왜 0보다 커야 하는지 이해가 가지 않아 끙끙댄 감이 있습니다. 결국 레퍼런스를 참조해야 했지요...

공백은 length가 0이다! 이 점만 기억하면 아래 8번 문제에서도 응용이 가능합니다.

 

 

07. convertListToObject

2차원 배열(배열을 요소로 갖는 배열)을 입력받아 각 배열을 이용해 만든 객체를 리턴해야 합니다.

인자 1 : arr

  • 배열을 요소로 갖는 배열
  • arr[i]는 string 타입을 요소로 갖는 배열
  • arr[i].length는 0 또는 2
  • arr[i]의 첫 번째 요소를 키, 두 번째 요소를 값으로 하는 객체를 리턴해야 합니다.
  • 중복되는 키의 경우, 초기의 값을 사용합니다.
  • 빈 배열을 입력받은 경우, 빈 객체를 리턴해야 합니다.
  • arr[i]의 길이가 0인 경우, 무시합니다.
function convertListToObject(arr) {
  // arr[i]의 길이가 0인 경우, 무시합니다.
  //arr[i]의 첫 번째 요소를 키, 두 번째 요소를 값으로 하는 객체를 리턴해야 합니다.
  let obj = {};
  //arr[i]는 각 배열을 가리킨다.
  //arr[i][0]는 각 배열의 1번째 녀석으로 객체의 키가 될 놈이다.
  //arr[i][1]은 각 배열의 2번째 녀석으로 객체의 값이 될 놈이다.
  for (let i = 0; i < arr.length; i++) {
    if(obj[arr[i][0]]===undefined&&arr[i].length !==0){
      obj[arr[i][0]] = arr[i][1]
    }
  }
  return obj;
}

객체를 만들어준 뒤에, 그 객체 내부에 조건을 통과한 키와 값을 넣어줍니다. 

 

 

08. convertDoubleSpaceToSingle

문자열을 입력받아 해당 문자열에 등장하는 두 칸의 공백을 모두 한 칸의 공백으로 바꾼 문자열을 리턴해야 합니다.

function convertDoubleSpaceToSingle(str) {
  //문자열을 입력받아 해당 문자열에 등장하는 두 칸의 공백을 
  //모두 한 칸의 공백으로 바꾼 문자열을 리턴해야 합니다.
  //두 칸의 공백을 한 칸으로 만든다?!
  return str.replace(/ +/g, " "); 
}

replace()와 정규식을 함께해서 공백을 제거했습니다. replace()의 사용법만 알고 있다면 어려운 문제는 아니네요. 

replace(찾을 값, 바꿀 값); 이런 식으로 활용되는데, 빈 칸이 두 개일 때를 정규식의 /g를 붙여 찾은 뒤 빈칸 하나로 바꿔 주었습니다. 여기서 /g는 글로벌의 약자로, 정규식에서 모든 패턴을 체크한다는 뜻입니다. 

 

예시를 더 볼까요?

.replace(/,/g,'')하면 ,를 제거하는 식으로 작동합니다. 

string.replace(/name | age | gender/g , '')

위와 같이 name, age, gender 이라는 글자가 있다면 전부 없애달라는 코드로도 활용 가능합니다.

 

 

정규식에 쓰이는 문자

g 모든 패턴 확인(global)
i 대소문자 구별 없이 확인
m 여러 줄 확인
^ 처음
$
. 한 문자

 

여담으로, 아래와 같은 풀이도 가능하다고 합니다. filter과 공백의 length를 활용한 식입니다.

function convertDoubleSpaceToSingle(str) {
  let result = str.split(" "); //공백 1칸으로 바꿔준다.
  result = result.filter((e) => e.length !== 0);
  // 공백 1칸의 길이는 0이니까 제외
  result = result.join(" "); //공백 1칸으로 다시 join
  return result;
}