반응형
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/17686
2. 코드
이 문제는 문자열 정리하기 + 상황에 따라 정렬하기 이 두 가지가 핵심인 문제다. 문자열을 정렬하기 좋게 head, number, tail로 나누는 과정에서 조건문을 잘 세워야한다.
무조건 처음에는 무조건 isNaN만 사용했는데, 그렇게 설정하면 tail로 들어가야 할 숫자들이 number로 들어가는 등 대참사가 일어난다^^ 공백을 isNaN을 통해 검색하면 true가 나올 것 같지만 의외로 false가 나온다. 이게 매우 중요한 부분이다! 그래서 parseInt를 한 번 써주고, 그것을 isNaN 검사 시켜야한다.
그리고 sort 함수 내부에 조건을 정의해줄 때는 모든 상황에 대한 분기처리를 해줘야 한다! 하나만 해주면 적용이 안된다. 이것도 중요!
const solution = (files) => {
// 파싱된 파일을 저장하는 배열
const newFile = [];
files.forEach(file => {
const parts = ['', '', ''];
[...file].forEach(word => {
const isNumber = !isNaN(parseInt(word));
// 만약 지금 글자가 숫자가 아니고 NUMBER 배열이 비어진 상태라면 ==> HEAD에 들어가야 한다.
if (!isNumber && !parts[1].length) {
parts[0] += word;
// 만약 지금 글자가 숫자이고, TAIL 배열이 비어진 상태라면 ==> NUMBER에 들어가야 한다.
} else if (isNumber && !parts[2].length) {
parts[1] += word;
// 그 외에는 TAIL에 추가.
} else {
parts[2] += word;
}
})
newFile.push(parts)
});
newFile.sort((a, b) => {
const stringA = a[0].toUpperCase(), stringB = b[0].toUpperCase();
// HEAD 정렬 : 앞 단어의 첫 글자가 사전 순 뒤이면 자리 바꾸기
if (stringA > stringB) {
return 1;
// HEAD 정렬 : 앞 단어의 첫 글자가 사전 순 앞이면 자리 유지
} else if (stringA < stringB) {
return -1;
// 각 단어의 첫 글자가 같으면 NUMBER 정렬
} else {
const parseIntA = parseInt(a[1]), parseIntB = parseInt(b[1]);
return parseIntA - parseIntB;
}
})
return newFile.map(arr => arr.join(''))
}
구현 유형 연습하기 딱 좋은 문제인 것 같다.
parseInt 쓰는 이유)
https://school.programmers.co.kr/questions/48261
이해에 참고한 블로그)
복기
6/6
반응형
'프로그래머스 > 구현' 카테고리의 다른 글
[구현] 프로그래머스 '뒤에 있는 큰 수 찾기' - js (1) | 2023.04.20 |
---|---|
[구현] 프로그래머스 '프렌즈4블록' - js (0) | 2023.04.19 |
[구현] 프로그래머스 '방문 길이' - js (0) | 2023.04.17 |
[문자열] 프로그래머스 '스킬트리' - js (0) | 2023.04.12 |
[문자열 & 해시맵] 프로그래머스 '오픈채팅방' (0) | 2023.04.10 |