본문 바로가기

카테고리 없음

두번째 코딩테스트 [JS문법 종합반 2주차] : 풀이성공

두번째 코딩테스트를 풀어봤다. 이번에는 답안을 보지않고 풀이팁만 보고 풀 수 있었다.

문제는 아래와 같다. 자세한 내용은 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가 대신할 수는 없다. 

 

그러하다.