배열 연습문제

유슬기·2022년 12월 30일
0

프론트엔드

목록 보기
13/64
post-thumbnail

createPhoneNumber

문제

0-9 사이의 정수를 요소로 갖는 배열을 입력받아 전화번호 형식의 문자열을 리턴해야 합니다.

주의 사항

반복문(for, while) 사용은 금지됩니다.
배열의 길이가 8인 경우, 앞에 [0, 1, 0]이 있다고 가정합니다.

입출력 예시

let output = createPhoneNumber([0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8]);
console.log(output); // --> '(010)1234-5678'

output = createPhoneNumber([8, 7, 6, 5, 4, 3, 2, 1]);
console.log(output); // --> '(010)8765-4321'

output = createPhoneNumber([0, 1, 1, 4, 3, 2, 1, 8, 7, 6, 5]);
console.log(output); // --> '(011)4321-8765'

풀이

처음에 생각한 풀이

function createPhoneNumber(arr) {
  // 0-9 사이의 정수를 요소로 갖는 배열을 입력받아 전화번호 형식의 문자열을 리턴해야 합니다.
  // 조건문으로 arr.length === 11글자/8글자인지 구분
  // 11글자인 경우: 앞에 3개 값은 ([0][1][2])로, 뒤에는 4개 단위로 끊어서 문자열로 반환
  // 8글자인 경우: (010)+ 인덱스 값들 4개 단위로 끊어서 문자열로 반환

  if (arr.length === 8) {
    return (`(010)${arr[0]}${arr[1]}${arr[2]}${arr[3]}-${arr[4]}${arr[5]}${arr[6]}${arr[7]}`)
  } else {
    return (`(${arr[0]}${arr[1]}${arr[2]})${arr[3]}${arr[4]}${arr[5]}${arr[6]}-${arr[7]}${arr[8]}${arr[9]}${arr[10]}`)
  }
}

템플릿 리터럴 방식을 사용하면 어떻게든 될 것 같아 떠오르는 대로 코드를 작성해 보았다.
깔끔한 코드는 아니지만 어찌저찌 테스트는 통과.
전화번호 앞자리, 중간자리, 끝자리를 나누어 생각하면 좀 더 좋은 코드로 리팩토링 할 수 있을 것 같다.

두번 째 풀이

// 3등분으로 나누어서 각각 변수 선언 (head, body, tail)
// 조건문으로 arr.length === 11 / 8 구분
// head, body, tail에 각각 맞는 범위만큼 slice로 자르기
// 위에서 자른 값을 join 메서드를 이용하여 문자열로 합치기
// 템플릿 리터럴로 출력예시에 맞춰서 리턴

function createPhoneNumber(arr) {
  let head = [];
  let body =[];
  let tail = [];
  if (arr.length === 8){
    head = [0,1,0].join("");
    body = arr.slice(0, 4).join("");
    tail = arr.slice(4, 8).join("");
    return `(${head})${body}-${tail}`
  } else {
    head = arr.slice(0,3).join("");
    body = arr.slice(3, 7).join("");
    tail = arr.slice(7,12).join("");
    return `(${head})${body}-${tail}`
  }
}

두번 째 풀이에서는 전화번호 앞자리, 중간자리, 끝자리를 나누어 각각 변수로 선언해주고, join 메서드를 사용하여 문자열로 합쳐주었다.
arr.length가 8인 경우, 11인 경우 모두 body와 tail 부분은 비슷해 보여 조금 더 고민 후 아래와 같이 리팩토링 해보았다.

세번 째 풀이

// arr를 slice로 자를 때, arr.length를 이용(뒤에서부터 세기 위해)
// 길이 11인 경우에만 head에 실제 요소의 값으로 join해서 재할당

function createPhoneNumber(arr) {
  let len = arr.length;
  let head = "010";
  let body =arr.slice(len - 8,len - 4 ).join("");
  let tail = arr.slice(len - 4).join("");
  
  if (len === 11) {
    head = arr.slice(0,3).join("");
  }

  return `(${head})${body}-${tail}`
}

2번의 리팩토링 끝에 드디어 마음에 드는 코드 작성 완료!
더 좋은 코드가 있을 수도 있지만 현재 배운 내용으로 최선을 다해 푼 것 같다.
추후 더 좋은 코드가 떠오른다면 수정할 예정이다.

profile
아무것도 모르는 코린이

0개의 댓글