문제
문자열로 구성된 리스트 strings와 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun","bed","car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u","e","a"로 strings를 정렬합니다.
제한 조건
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100 이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예시
strings | n | return |
["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] |
["abce", "abcd", "cdx"] | 2 | [ "abcd" ,"abce", "cdx"] |
sun, bed, car의 1번째 인덱스 값은 각각 u,e,a 입니다. 이를 기준으로 strings를 정렬하면 car, bed, sun입니다.
abce와 abcd, cdx의 2번째 인덱스 값은 c,c,x 입니다. 따라서 정렬 후에는 cdx가 가장 뒤에 위치합니다.
abce와 abcd는 사전순으로 정렬하면 abcd가 우선하므로 답은 abcd, abce, cdx입니다.
나의 풀이
이 문제를 보고 가장 처음 들었던 생각은 strings라는 배열의 element 중 n번째 문자를 뽑아 순서대로 정렬한 후 그 순서를 그대로 구조분해할당하면 되겠다고 생각하고 시도했다.
function changeOrder(strings,n){
let str = strings.map(el => {
return el.slice(n);
});
str.sort();
console.log(str);
}
let strings = ['sun','bed','car'];
let n = 1;
changeOrder(strings,n);
그래서 처음에는 strings의 element에서 u, e, a 를 뽑아 정렬한 후 a, e, u를 만들었는데 '이렇게 만든 순서를 원 배열에 어떻게 다시 적용시켜주지? '라는 생각이 들면서 막히게 되었다.
이걸 바탕으로 strings의 element에서 n번째값을 뽑는 게 아니라 n번째를 기준으로 slice를 해줌으로써 element의 n번째 값이 문자의 가장 앞에 오게 했다.( 이런식으로 => strings = ['un', 'ed', 'ar'])
그리고서 정렬을 시도해봤는데 정답과 비슷하게 얼추되긴 했다. ((ar, ed, un)순서로)
'하지만 앞에 c, b, s는 어떻게 되돌려?????? 만약 돌린다고 해도 문제 조건에 따라 길이가 50짜리일수도 있는데???' 라는 생각이 들며 또 막힘.
이렇게 하고 나니 여기서 생각이 좀 들었다.
아. strings의 element들은 건들면 안되는구나.
그렇다면 남은 건 sort 하나뿐이었다. sort의 부가 기능이 있었나 싶어 sort를 검색해봤다.
sort에는 파라미터로 함수를 받을 수 있다. 처음 안 사실이다.
function의 파라미터로는 a,b를 받으며 function의 결과 값이 0보다 작으면 오름차순, 0이면 순서의 변동이 없고, 0보다 크면 내림차순이었다.
또한 a, b 값은 배열의 element와 같은 역할을 하는 것이었다(element라고 생각해도 무방할 듯 ). 각 element를 a와 b로 비교해서 정렬을 하는 형식이었다.
여기서 또 중요한 부분이 있다.
sort를 찾다보니
https://hianna.tistory.com/409 이 분이 적어 놓으신 sort 정리를 보게 되었는데 객체의 key값을 기준으로 객체를 오름차순 하는 것을 보았다.
arr.sort(function(a,b){
result a.key값 - b.key값
});
이런 식으로 작성해 놓았는데 key값을 기준으로 오름 차순이 되는 것을 보았다.
참고로 일반적인 함수를 적어보면 다음과 같다.
arr.sort(function(a,b){
return a-b // 오름차순
return b-a // 내림차순
})
이 두개를 보고서 문자열 내 특정 인덱스의 순서를 기준으로 문자열을 정렬할 수도 있겠다 싶어서 바로 적용해 보았다.
function changeOrder(strings,n){
strings.sort(function(a,b){
return a[n]-b[n];
});
return strings;
}
이게 웬걸; 안된다;;;;;;
다시 sort의 기본원리로 돌아가 if문으로 0과 비교하는 조건을 만들어줬다.
function changeOrder(strings,n){
strings.sort(function(a,b){
if(a[n]-b[n]<0){
return -1;
} else if(a[n]-b[n]>0){
return 1;
} else {
return 0;
}
});
return strings;
}
오... 된다...!!
그런데 2문제 중 한 문제만 맞았네(?)
알고보니 abce 와 abcd의 순서에서 n=2일 때 c와 c가 같기 때문에 안된 것 같다.
왜냐하면 내가 조건으로 a[n]-b[n] =0이면 순서를 바꾸지 말라고 지정해줬기 때문에,,,,
그래서 즐거운 마음으로 마지막을 바꿔줬다.
function changeOrder(strings, n) {
strings.sort(function (a, b) {
if (a[n] < b[n]) {
return -1;
} else {
return 1;
}
});
return strings;
}
문제 둘 다 맞춤!!!
후하후하후ㅏ후ㅏㅎ하ㅜㅎ후후ㅜ하ㅜ하
수정
앞의 두 문제는 맞았다고 뜨는데 시간초 때문인지 용량 때문인지 성공 반 실패 반이네 다시 작성해오겠슴다.
수정 완료
왜인지는 모르겠으나 일단 앞의 부분은 틀렸다....
너무 너무 많은 시간을 투자해서 다른 공부를 위해 진짜 살짝 내용 해설 봤다. for문으로 푸네?
for문으로 푼다는 것만 보고 내 주특기인 for문 박치기를 해봤다.
function solution(strings, n) {
var answer = [];
for(let i=0;i<strings.length;i++){
strings[i] = strings[i][n] + strings[i];
}
strings.sort();
for(let j=0;j<strings.length;j++){
strings[j] = strings[j].replace(strings[j][0],'');
}
answer = strings;
return answer;
}
성공이었댜..............
수정2
앞서 sort 메서드만 사용해서 푸는 문제는 코드의 마지막 끝 맺음이 좋지 않아서 테스트 코드에서 몇 개는 맞고 몇 개는 틀렸었다.
a[n]과 b[n]을 비교함에 있어서 a[n] === b[n] 인 경우를 제외하면 잘 풀었지만 이게 가장 큰 문제였다.
a[n] === b[n] 인 경우 function값으로 0을 반환하면 둘의 순서가 바뀌지 않는다. 물론 문자열 전부가 같으면 순서를 바꾸지 않아도 상관 없겠지만 문자열 중 n자리만 같기 때문에 전체문자열을 사전편찬식으로 오름차순 정렬해야 했기 때문에 0으로 반환하는 것은 문제가 있었다.
하지만 1이나 -1으로 반환하자니 '전체문자열'을 비교할만한 조건을 넣어줄 수가 없었다.
이 때, 조건을 넣어줄 수 있는 방법으로 삼항 연산자를 넣어봤다. if문을 쓰기도 어렵고 혹여나 쓴다고 해도 가독성을 해칠 수 있는 위치에 있기 때문에 삼항 연산자를 통해 해결했다.
(삼항 연산자 요새 특히나 많이 보이는 것 같다. 알긴 하는데 많이는 안써본 것 같은 느낌)
for문을 이용하지 않은 sort로만 완성된 코드는 다음과 같다.
function solution(strings, n) {
strings.sort(function (a, b) {
if (a[n] < b[n]) {
return -1;
} else if(a[n] > b[n]){
return 1;
} else {
return a<b ? -1 : 1;
}
});
return strings;
}
// 연습할 때 임의로 만들어둔 코드들
let strings = ['sun', 'bed', 'car'];
let n = 1;
solution(strings, n);
console.log(strings)
'Algorithm' 카테고리의 다른 글
짝수와 홀수 [프로그래머스] (0) | 2023.10.16 |
---|---|
평균 구하기 [프로그래머스] (0) | 2023.10.16 |
음양 더하기 [프로그래머스] (1) | 2023.10.13 |
문자열 내 p와 y의 개수 [프로그래머스] (0) | 2023.10.13 |
문자열의 길이 반환 (0) | 2023.10.12 |