본문 바로가기

verdantjuly/코딩테스트

프로그래머스 코딩테스트 : 문자열 내 마음대로 정렬하기

728x90

튜터 님께 여쭤봤는데 일반적으로 알고리즘 테스트에서는 sort를 사용하지 않으나 너무 어렵고 막히면 사용하라고 하셨다.

현업에서는 sort하면 된다고 하셨다.

참고 자료 : 정렬 알고리즘 https://im-developer.tistory.com/133

나의 풀이 1  pass

// sort 라는 것을 배우지 않아 사용하지 않고 진행하려고 하였으나 
// 시간이 너무 지체되어 마지막 if문의 else 에서 사용함.

// 문자열로 구성된 리스트 strings
// 정수 n
// 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
// 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
//  모든 strings의 원소의 길이는 n보다 큽니다.
function orem(strings, n) {
    let array = [];
    let array2 = [];
    let newstrings = [];
    for (i = 0; i < strings.length; i++) {
        array.push(strings[i][n])

        // array : i 번째 stirngs의 문자열을 하나씩 쪼갠 배열을 array라는 배열의 요소로 모아준다.
        // 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬

        if (array[i] < array[i + 1]) {
            newstrings.unshift(strings[i]);

        } else if (array[i] > array[i + 1]) {
            newstrings.push(strings[i]);
        } else{
            newstrings.unshift(strings[i]);
            newstrings.sort()
        }
}


console.log(newstrings)
}
orem(["abce", "abcd", "cdx"], 2)

나의 풀이 2

예제에서는 pass 이나 프로그래머스에서 다른 입출력 예시로 진행하면 fail

// 문자열로 구성된 리스트 strings
// 정수 n
// 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
// 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
//  모든 strings의 원소의 길이는 n보다 큽니다.
function orem(strings, n) {
    let arrayN = []

    for (k = 0; k < strings.length; k++) {
    for (i = 0; i < strings.length - 1-k; i++) {
        for (j = 0; j < strings.length; j++) {
            arrayN[j] = strings[j].substr(n) 
            // strings의 각 문자열을 인덱스 n부터 자른 것을 arrayN에 담는다.
        }
        if (arrayN[i] > arrayN[i + 1]) { //앞 단어가 더 클 때
            let spin =[]
            spin = strings[i]
            strings[i] = strings[i + 1]
            strings[i + 1] = spin //뒷 단어를 앞으로 당긴다

        }}
    }
    console.log(strings)
}
orem(["abce", "abcd", "cdx"], 2)

 

다른 사람의 풀이

캠프 대원 익명 님의 풀이 pass

function solution(strings, n) {
  let arr = [];
  strings.forEach((i) => {
    arr.push(i[n] + i);
  });
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        let copy = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = copy;
      }
    }
  }
  let result = [];
  arr.forEach((i) => {
    result.push(i.slice(1));
  });
  return result;
}
return strings.sort().map((val) => `${val[n]}${val}`).sort().map((val) => val.slice(1))

캠프 대원 인한별 님의 풀이 pass

return strings.sort().sort((a, b) => a[n] < b[n] ? -1 : 0);

익명 님의 풀이 pass

function solution(strings, n) {
    for (let i = 0; i < strings.length; i += 1) {
    for (let j = 0; j < strings.length - i - 1; j += 1) {
      if (strings[j].charCodeAt(n) > strings[j + 1].charCodeAt(n)) {
        // swap
        let temp = strings[j];
        strings[j] = strings[j + 1];
        strings[j + 1] = temp;
      } else if (strings[j].charCodeAt(n) === strings[j + 1].charCodeAt(n)) {
        if (strings[j] > strings[j + 1]) {
          let temp = strings[j];
          strings[j] = strings[j + 1];
          strings[j + 1] = temp;
        }
      }
    }
  }
  return strings;
}

 

소감

강의 밖에 많은 것을 배워야 한다는 생각이 들었다. 자만하지 말자. 네버...