본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 파일명 정렬

by StelthPark 2022. 3. 11.

처리조건

풀이

입력 : ["foo9.txt", "foo010bar020.zip", "F-15"]

입력으로 들어온 파일명들을 for문을 돌려 하나하나 분해하게 될 것인데 foo9.txt에서 인덱스마다 정규표현식.test를 거쳐 문자라면 pushString에 쌓고 숫자라면 pushNumber에 쌓는데 처리조건에 보면 알파벳이 먼저 들어오고 다음 숫자가 들어오며 알파벳은 HEAD로 숫자는 NUMBER로 보면 된다. 결과를 가장 큰 for문이 한번 끝날때마다 convert 배열에 담아준다.

이 후에 이제 정렬을 해줘야한다. for문으로 다시 돌려 기준인덱스와 기준인덱스+1를 한 값의 인덱스0인 HEAD부분을 비교하여 뒤 HEAD보다 크면 자리를 바꿔주고 만약 같으면 인덱스1의 숫자를 비교하여 큰 것을 뒤로 옮겨 위치를 바꾼다. 여기서 for문을 돌면 아직 정렬되지 않은 값들이 분명 있을 것이다. 그래서 이 for문을 while문에 넣어 계속 순서를 정렬해주고 순서정렬을 count로 올려 순서정렬이 안이루어지면 더이상 처리할 것이 없으므로 count가 0일시 종료하게된다. while문이 돌 때는 count를 계속 0으로 리셋한다.

 

이제 배열안 각 문자들은 배열단위로 나눠줘있으니 map으로 각 배열안 문자배열로 접근해 reduce를 통해 앞뒤로 문자열을 합친다.

 

잘 고민 해봐야할 부분은 순서를 정렬하기전에 들어오는 문자들을 알파벳과 숫자로 그리고 이후에 들어오는 tail부분을 잘 나눠서 배열에 담아줘야하는데 tail부분이 빈문자열일수도 있다는 점을 주의해야한다.

 

function solution(files) {
  let convert = [];
  for (let i = 0; i < files.length; i++) {
    let pushString = "";
    let pushNumber = "";
    for (let j = 0; j < files[i].length; j++) {
      if (/[0-9]/.test(files[i][j])) {
        if (j === files[i].length - 1) {
          pushNumber += files[i][j];
          convert.push([[pushString], [pushNumber]]);
          break;
        }
        pushNumber += files[i][j];
        continue;
      } else if (pushString.length !== 0 && pushNumber.length !== 0 && /[0-9]/.test(files[i][j]) === false) {
        convert.push([[pushString], [pushNumber], [files[i].slice(j)]]);
        break;
      }
      pushString += files[i][j];
    }
  }

  while (true) {
    let count = 0;
    for (let i = 0; i < convert.length - 1; i++) {
      if (String(convert[i][0]).toLowerCase() > String(convert[i + 1][0]).toLowerCase()) {
        let temp = convert[i];
        convert[i] = convert[i + 1];
        convert[i + 1] = temp;
        count++;
      } else if (String(convert[i][0]).toLowerCase() === String(convert[i + 1][0]).toLowerCase()) {
        if (Number(convert[i][1]) > Number(convert[i + 1][1])) {
          let temp = convert[i];
          convert[i] = convert[i + 1];
          convert[i + 1] = temp;
          count++;
        }
      }
    }
    if (count === 0) break;
  }
  convert = convert.map((el) => {
    return el.reduce((a, c) => {
      return a + c;
    });
  });
  return convert;
}

댓글