두번째 코딩테스트를 풀어봤다. 이번에는 답안을 보지않고 풀이팁만 보고 풀 수 있었다.
문제는 아래와 같다. 자세한 내용은 url 참조 바란다.
https://school.programmers.co.kr/learn/courses/30/lessons/12915?language=javascript
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한조건
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다. strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
매우 어려웠다. 풀이팁을 안 보려고 했지만 도저히 불가능했다. 문자열 맨 앞에 인덱스n번째 문자를 붙이고, 그렇게 만든 배열을 정렬한 뒤, 그 배열의 각 요소에서 첫번째 문자를 빼내야 하는 문제였다. 그런 아이디어가 도무지 생각나지 않았다. 도대체 어떻게 하면 생각이 나게 될까?
하지만 풀이팁을 보고 코드로 구현할 수 있었다. 답안코드는 보지 않았으니 풀었다고 해야 할까?
아무튼 구현하는 데 1.5시간은 걸린 것 같다. 어려움이 많았지만 console.log가 많이 도와주었다. 그리고 한가지 배운 점은, 일단 로직의 일부라도 구현해보고 console.log로 확인해 보라는 것이다. 일부를 구현해 내면 또 그 다음의 일부를 구현하고, 또 그 다음 한 단계를 구현하고 이런 식으로 구현해 나가는 것이 전체를 한 번에 구현하는 것보다 더 현실적이다.
하여 아래는 나의 답안이다.
function indexSort(strings, n) {
let indexedArray = [];
strings.forEach(string => {
let indexPlus = string[n].concat(string)
console.log(indexPlus)
indexedArray.push(indexPlus)
});
indexedArray.sort()
console.log(indexedArray)
let answer = []
indexedArray.forEach(string => {
answer.push(string.substr(1))
})
console.log(answer);
return answer
}
let stringsB = ['apple', 'banana', 'toz', 'dot', 'english']
indexSort(stringsB, 1)
코드가 너무 길다. 비효율적이다. 답안코드는 더 간결하다.
on solution(strings, n) {
let result = [];
// 문자열 가장앞 글자 붙인 문자 배열 만들기
for (let i = 0; i < strings.length; i++) {
strings[i] = strings[i][n] + strings[i];
}
console.log(strings)
// 문자열 사전순 정렬
strings.sort();
// 앞글자 제거 후 리턴
for(let j = 0; j < strings.length; j ++) {
strings[j] = strings[j].replace(strings[j][0],"");
result.push(strings[j]);
}
console.log(result)
return result;
}
let stringsB = ['apple', 'banana', 'toz', 'dot', 'english']
solution(stringsB, 1)
위의 코드 중
strings[i] = strings[i][n] + strings[i];
부분이 있다. strings 배열을 정렬하는 기준 인덱스가 되는 글자만 따서 요소의 맨 앞에 붙이고, 그 붙인 것으로 배열에 대체해 넣는 코드다for 에서는 가능한 코드이나 30분 실험 결과 forEach에서는 안 작동한다. 모든 for 를 forEach가 대신할 수는 없다.
그러하다.