공부 및 일상기록

문자열 내 마음대로 정렬하기 본문

개발/알고리즘, 자료구조

문자열 내 마음대로 정렬하기

낚시하고싶어요 2023. 4. 20. 14:47

문제설명

문제

  • 문자열로 구성된 배열 strings와 정수 n이 주어짐
  • 각 문자열의 n번째 인덱스 글자를 기준으로 오름차순 정렬할것

제한조건

  • strings는 길이 1 이상, 50 이하인 배열
  • 원소는 모두 소문자
  • 모든 strings의 원소의 길이는 n보다 큼
  • 만약 n번째 인덱스의 문자가 같은 원소가 여러개면 사전순으로 정렬

문제풀이

나의 접근 방식

먼저 인접한 두 인덱스를 비교하여 작은것은 앞으로, 큰것은 뒤로 보내면서 정렬을 시도해야 겠다고 생각했다.

따라서 for문을 이용하는데, 이렇게 for문 1개만 사용하면 제일 큰 숫자만 제일 뒤에 있게되고 나머지는 그대로이다.

그래서 for문 안에서 또다른 for문을 넣고, 안쪽 for문은 이미 정렬된 제일 큰 숫자를 건들 필요가 없으므로 바깥쪽 for문의 i만큼 짧은 길이를 검사했다.

이러한 접근 방식을 버블정렬이라고 한다.

인접한 두 인덱스의 값을 비교 후, 위치를 교환하기 위해 변수 a를 선언해 ㅑ인덱스 값을 복사해두고, i인덱스에 i+1인덱스 값을 넣은 후, i+1에는 다시 변수 a를 할당해 위치를 바꾼다.

실제 작성한 코드

//일단 같은 문자열일 경우 사전순으로 정렬되도록 하기 위해 미리 sort함수로 정렬하고 시작했다.
function solution(strings, n) {
  strings.sort();
  //2중 for문을 도입하여 인접한 두 수를 비교 하고, 대소비교를 해서 서로의 위치를 바꾼다. 이렇게하면 제일 큰 수는 제일 뒤에 위치하게 된다.
  //따라서 제일 큰 수는 건들 필요가 없으므로 안쪽 for문에서 strings.length-i-1을 한다.
  for (let i = 0; i < strings.length; i++) {
    for (let j = 0; j < strings.length - i - 1; j++) {
      if (strings[j][n] > strings[j + 1][n]) {
        // j와 j+1의 자리를 바꿔치기 위해서 일단 변수 a에 담아 j번째를 담아 교환한다.
        let a = strings[j];
        strings[j] = strings[j + 1];
        strings[j + 1] = a;
      }
    }
  }
  return strings;
}