일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- react
- cs #네트워크
- 자바스크립트
- 유데미
- typescript
- 스나이퍼팩토리
- 인사이드아웃
- BFS
- 알고리즘
- 타입스크립트
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- ip
- html
- 메모리
- CS
- 프로그래머스
- 개발자부트캠프
- 웅진씽크빅
- javascript
- React.js
- 프로젝트캠프
- App Runner
- 네트워크
- 스레드
- IT개발캠프
- 해시
- 리액트
- react-query
- 프로세스
- Algorithm
- Today
- Total
Bin's Blog
[프로그래머스] Level2 - 파일명 정렬(Javascript) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▶ 문제 요약
1. HEAD, NUMBER, TAIL 세 부분으로 나눈다.
2. HEAD는 사전 순으로 정렬한다. 대소문자를 소문자로 변환해서 정렬한다.
3. NUMBER은 Number()나 ParseInt()를 사용하지 않고 정렬한다.
4. TAIL부분은 신경을 쓰지 않아도 된다.
5. 정렬을 다했으면 다시 분할된 문자열을 하나로 합쳐준다.
▶ 코드
function solution(files) {
let answer = [];
// 정규표현식 사용
const regex = /(\d+)|(\D+)/g;
// 입력값을 분할 및 배열에 담기
for (let i = 0; i < files.length; i++) {
let split = files[i].match(regex);
answer.push(split);
}
// 배열을 정렬하는데 만약에 배열의 첫 번째 요소를 기준으로 정렬
answer.sort((a, b) => {
const firstCompare =
a[0].toLowerCase()
.localeCompare(b[0]
.toLowerCase());
if (firstCompare !== 0) {
return firstCompare;
}
// 첫 번째 요소가 같은 경우 두 번째 기준으로 요소를 정렬
return a[1] - b[1]
});
// 분할된 문자열 합치기.
return answer.map(el => el.join(""));
}
▶ 풀이 과정
1. 정규 표현식을 활용했다. 자세히 설명 들어가면 먼저 시작과 끝을 나타내는 "/" 기호를 처음과 끝에 쓴다. 다음은 마지막 "g"부터 보면 g는 전역적으로 검색한다는 의미를 가지고 있다.
무슨 뜻일까....?? 대상 문자열 내에서 해당 패턴과 일치하는 모든 부분을 찾는 것을 말한다.
다음으로 이제 괄호를 들여다보자.
"|"는 OR(또는)의 개념이고 OR의 기준으로 좌우 두 개를 보자.
"(\d+)"랑 "(\+D)"이다. 소문자d는 숫자 그룹[0-9]를 찾는 것이며, 대문자D[^0-9]는 문자 그룹을 찾는 것이다. 괄호는 안 써도 된다.(선택사항)
"\" 이건 특수 문자를 이스케이프 한다는데 여기서 잠깐...!!!
Escape(이스케이프)는 쉽게 말해서 특수 문자를 문자 그대로 사용하고 싶을때 사용한다.
2. 주어진 입력값을 for loop를 이용해서 돌면서 정의한 정규 표현식과 일치하는지 match()함수를 활용한다. 그리고 배열에 담아준다.
3. 입력 1번을 보면 "IMG01.GIF"가 있다. 대문자를 고려하지 않고 정렬하게 된다면 이 문자가 가장 앞으로 온다 그러나 출력값은 두 번째로 와야한다. toLowerCase()함수를 활용해서 소문자로 변환해서 문제를 해결한다.
4. localeCompare()함수를 활용하면 문자열을 비교해준다. 정렬 순서에 따라 정수값을 반환한다.
case1. 음수일 경우 대상 문자열이 비교 문자열보다 앞에 오는 경우!
case2. 0인 경우는 대상 문자열이 비교 문자열이랑 같은 경우
case3. 양수일 경우 대상 문자열이 비교 문자열보다 뒤에 오는 경우!
5. if문 조걸에 0이 아니라면 비교할 수 있는 대상인거니까 첫 번째에서 정렬을 끝을 내고 0이라면 같은 경우니까 다음 문자열을 비교해준다.
6. 정렬이 다 됐으면 분할된 문자열을 map()함수를 활용해서 배열 내의 모든 요소에 동일한 작업을 처리하는 함수인데 join()을 사용하면 바로 분할된 것을 다시 풀로 붙이듯이 붙여주니까 결과적으로 우리가 원하는 값을 도출 할 수 있다.
▶ 배운점
1. Regex(정규 표현식)을 활용하면 쉽게 주어진 문자열을 분할할 수 있다.
2. 문자열 정렬을 하고 싶으면 localeCompare()함수를 떠올리자.
3. 배열 내의 모든 요소에 어떠한 작업을 하고 싶다면 map()함수를 적극적으로 활용하자.
'Algorithm' 카테고리의 다른 글
[프로그래머스] Level2 - 뒤에 있는 큰 수 찾기(Javascript) (0) | 2023.04.25 |
---|---|
[프로그래머스] Level2 - 2 x n 타일링(Javascript) (0) | 2023.04.25 |
[프로그래머스] Level2 - 프렌즈4블록(Javascript) (0) | 2023.04.24 |
[프로그래머스] Level2 - n진수 게임(Javascript) (0) | 2023.04.23 |
[프로그래머스] Level2 - 압축(Javascript) (0) | 2023.04.22 |