https://programmers.co.kr/learn/courses/30/lessons/42748
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 배열 array에서 i번째 부터 j 번째까지 자르고 이 새로운 배열을 정렬시킨 다음에 k번째 숫자가 무엇인지 찾아라. - 주어진 자료는 무엇인가?
- array와 i, j, k를 담은 2차원 배열인 commands - 조건은 무엇인가?
- commands의 원소의 길이는 3이다. - 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라.
- 문제에서 배열의 인덱스가 0부터 시작인것을 고려 안해줘서 i-1. j-1. k-1로 바꿔줘야한다.
2. 계획
- 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
- i, j번째에 있는 배열의 요소를 찾아야하는것이기 때문에 slice()를 사용할 수 있을것같다.
- 정렬을 시키는것이 조건이기에 sort()를 사용할 수 있을것이다. - 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라
- 예제 코드의 commands의 길이가 길어서 헷갈릴 수 있으니까 우선, commands안에는 하나의 배열만 있을때라고 가정하고
코드를 풀어보자 - 주어진 자료로부터 유용한 것을 이끌어 낼 수 있는가?
- commands 안에서 배열들 하나씩 확인해봐야하니까 map()을 사용할 수 있을것같다.
첫번째 풀이 계획
1. commands[0]을 firstArr라는 변수에 할당 (2차원 배열에서 벗어나야겠다고 생각했음).
2. array를 firstArr의 0번째 인덱스에서 -1을 한 인덱스부터 ~ firstArr의 1번째 인덱스까지 slice()를 한다.
3. 그리고 이것을 sort()를 사용하여 정렬한다.
4. firstArr의 2번째 인덱스에서 -1을 한 인덱스를 이렇게 해서 나온 배열내에서 찾아본다.
5. 그리고 이 숫자를 배열 안에 넣어서 리턴해준다.
두번째 풀이 계획
1. 결과 값을 담을 result라는 변수를 만들어준다. 그리고 여기에 값을 넣어줄거다.
2. commands에 map()함수를 적용했다.
3. 그리고 이 안에 arr라는 변수를 만들어줬다.
4. arr라는 변수에는 array를 commands의 요소인 num[0]-1 부터 ~ num[1]까지 slice()한다.
5. 그리고 이것을 sort()를 사용해서 정렬해준다.
6. arr의 num[2]-1번째 인덱스를 찾아서 리턴해준다.
7. 이 값들이 처음에 설정해둔 result에 저장되었기 때문에 return result를 해준다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
첫번째 풀이
const solution = (array, commands) => {
const firstArr = commands[0];
const first = array.slice([firstArr[0] - 1], [firstArr[1]]).sort((a,b) => a-b);
const f = first[firstArr[2] - 1];
return [f];
};
test('commands배열 안에 한개의 배열만 있는 경우', () => {
expect(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3]])).toBe([5]);
});
두번째 풀이
const solution = (array, commands) => {
const result = commands.map((num) => {
const arr = array.slice(num[0] - 1, num[1]).sort((a, b) => a - b);
return arr[num[2] - 1];
})
return result;
};
test('commands배열 안에 한개의 배열만 있는 경우', () => {
expect(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3]])).toBe([5]);
});
test('i번째 부터 j번째 까지 자른 수를 넣은 배열', () => {
expect(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]])).toBe([5, 6, 3]);
});
4. 반성
- 문제를 다른 방식으로 해결할 수 있는가?
- 첫번째 풀이를 하고 생각해보았는데 이때 map()를 사용할 수 있겠다고 생각했다.
🦄 Findings
문제를 단순하게 하기위해서 조건을 버리는 방법을 알게되었다.
맨 처음에는 변수를 second, third까지 쓰고 하나씩 계산해보았는데 오히려 더 헷갈리기만 했다.
이때 조건을 버려서 commands의 길이가 1일때라고 가정하고 풀어볼 수 있었다.
sort()의 사용법에 대해서도 다시 알게되었다.
맨처음에 오름차순 정렬하라고 해서 그냥 sort()만 했는데 원하는 값이 안나오는 경우가 있었다.
그래서 sort((a,b) => a-b) 이렇게 해줘야만하는 이유를 알게되었다.
sort()와 sort((a,b) => a-b)의 차이는 무엇일까?
sort 함수는 기본적으로 배열을 문자열로 간주하고 비교한다.
예를 들어 [b,a,c]라는 배열에 .sort()를 적용하면 [a,b,c]로 알맞게 정렬해준다.
그런데 숫자의 경우 [90,100,110]을 sort()로 정렬하면 자바스크립트는 값을 "90" "100" "110"으로 간주하고 비교한다.
이때 "90"과 "100"을 비교 시 앞자리 9와 1을 비교, 100보다 90이 더 크다는 결론을 내린다.
'코테연습' 카테고리의 다른 글
54. 모의고사 Javascript (0) | 2022.05.29 |
---|---|
53. 문자열압축 Javascript (0) | 2022.05.27 |
51. 위장 Javascript (0) | 2022.05.25 |
50. 소수 만들기 javascript (0) | 2022.05.24 |
49. 완주하지 못한 선수 (0) | 2022.05.24 |
댓글