공부/JavaScript

JavaScript 문법 종합 2주차(숙제)

뀨뿌뀨뿌 2023. 5. 25. 01:29

Q.  배열 연습하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

🚫제한 사항
strings는 길이 1 이상, 50이하인 배열입니다.

strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

❗입출력 예

strings  n return
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

입출력 예 설명
입출력 예 1"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.
입출력 예 2"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

😀 내가 푼 답

// 첫번째 코드 구현
const func = (string, n) => {
  return string.sort((a, b) => {
    if (a[n] > b[n]) {
      return 1;
    } else if (a[n] < b[n]) {
      return -1;
    } else {
      return 0;
    }
  });
};

const str1 = ["sun", "bed", "car"];
const num1 = 1;
console.log(func(str1, num1));   // 통과
const str2 = ["abce", "abcd", "cdx"];
const num2 = 2;
console.log(func(str2, num2));   // 동일한 문자열이 발생 햇는데 사전순으로 위치하지 않음

// 두번째 코드 구현
const func = (string, n) => {
  return string.sort((a, b) => {
    if (a[n] > b[n]) {
      return 1;
    } else if (a[n] < b[n]) {
      return -1;
    } else if (a[n] === b[n]) {
      if (a < b) {
        return -1;
      }
      if (a > b) {
        return 1;
      }
    } else {
      return 0;
    }
  });
};
  • 두번째 코드를 구현하면 통과되지만 코드의 가독성이 떨어져 if문을 삼항연산자로 변경
// 최종코드
const func = (string, n) => {
  return string.sort((a, b) => {
    return a[n] > b[n] ? 1 : a[n] < b[n] ? -1 : a > b ? 1 : -1;
  });
};
  • sort() 메서드
    • sort 메서드는 배열의 요소를 정렬하는데 사용하는 함수
    • sort함수의 원리
      ✔ sort 함수에서 파라미터를 넣어주면 그 값을 비교해서 sort를 사용하는 형식
      ✔ 기본적으로 유니코드값으로 정렬함
       sort함수 자체는 배열을 반환하지만, sort안에 들어있는 함수의 return값은 숫자
    • sort 함수 응용
      ✔ arr,sort([compareFunction]) 에서 compareFunction(a, b)는 정렬순서를 정의하는 함수
      ✔ 들어온 a, b의 값에서 a - b를 했을 경우 a가 크면 양수가, a가 작으면 음수가 나오게 됨
          => 음수가 나온다는 것은 a값이 더 작다는 뜻
      ✔ 음수나 0값이 나오게되면 오름차순 기준으로는 자리를 바꾸지 않고, 양수가 나오면 바꾸게 됨
      반환 값 < 0 : a가 b보다 앞에 있어야 함
          반환 값 = 0 : a와 b의 순서를 바꾸지 않음.
          반환 값 > 0 : b가 a보다 앞에 있어야 함.
       숫자 비교를 위해서는 array.sort((a,b) => a-b)로 오름차순 정렬 가능.

😊 문제풀이 답안

function solution(strings, n) {
  var answer = [];

  // 1. 문자열 가장 앞 글자를 붙인 배열 만들기
  for (let i = 0; i < strings.length; i++) {
    strings[i] = strings[i][n] + strings[i];
    // car -> a + car -> acar
  }

  // console.log(strings); // [ 'usun', 'ebed', 'acar' ]

  // 2. 해당 배열을 사전순으로 정렬(sort)
  strings.sort();
  // console.log(strings); // [ 'acar', 'ebed', 'usun' ]

  // 3. 앞글자 제거 후 리턴
  for (let j = 0; j < strings.length; j++) {
    strings[j] = strings[j].replace(strings[j][0], "");
    answer.push(strings[j]);
  }
  // console.log(`answer, ${answer}`); // answer, car,bed,sun

  return answer;
}

// solution(["sun", "bed", "car"], 1);
  • replace() 메소드
    • 특정 문자를 다른 문자로 치환하는 할수 있음
    • replace 메소드는 두가지 인자를 전달 받는데 첫번째로는 바꿀 요소를 선택, 두번째로는 어떻게 바꿀것인지를 전달

 

'공부 > JavaScript' 카테고리의 다른 글

1주차 팀과제(야구게임)  (2) 2023.06.13
JavaScript 문법 종합 3주차(1)  (0) 2023.06.12
JavaScript 문법 종합 2주차(1)  (1) 2023.05.24
JavaScript 문법 종합 1주차(숙제)  (0) 2023.05.24
JavaScript 문법 종합 1주차(2)  (0) 2023.05.24