오늘 뭐했냐/기억하면 좋을 문제들

배열 복사, indexOf

스스로에게 2023. 6. 13. 18:51

그 동안에 쓴 글이 의미 없진 않지만 노력에 비해 매우 잘못된 방향성을 가지고 있단 것을 알게되었다 지금이라도 알았으니 다행이고 알았으면 바뀌려고 노력해야지 

 

제목은 나중에 찾기 편하게 검색용

 

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요

 

입력 출력
[3, 76, 24] [3, 1, 2]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

먼저 어떻게 할지 생각을 해보자 

1. 배열을 복사해 순서대로 정렬 

2. 복사한 배열을 정렬하고 비교 해서 완성한다

 

배열 복사는 쓰레드 문법으로 해결 정렬까지 완료  얕은 깊은 복사 확인 완료

let arr = [...emergency].sort((a, b) => b - a)

반복문 돌렸는데 

 

 

문제 

  1. 반복 조건에서 .length 빼먹었는데 그냥 반복문만 무시되고 오류 안떠서 나중에 발견하고 추가 
  2. 배열의 인덱스 가져와서 빈 배열에 푸쉬했으니 생각을 잘못했다 
  3. 그래서 k라는 새로운 값을 만들어 입력받은 배열을 조건에 맞게 하나씩 바꾸자 
  4. k가 반복문 안에서 선언하니 증가가 안된다 반복문 밖에 선언으로 변경
  5. 해결하나 싶었으나  [1, 2, 3, 4, 5, 6, 7]  이 때 실패 [7,6,5,4,5,6,7] 
  6. map()을 써보자 맵에서의 콜백에서 조건 걸고 억지로 써보려 했으나 undefined

 

해결 

function solution(emergency) {
    let result = new Array(emergency.length)
    let copy = [...emergency].sort((a, b) => b - a)
    let k = 0
    for (let i = 0; copy.length > i; i++) {
        k++
        for (let j = 0; emergency.length > j; j++) {
            if (copy[i] === emergency[j]) {
                result[j] = k
            }
        }
    }
    return result;
}

결국엔 해결 기존 k를 새로운 빈 배열에 추가했다

 

 

성과 :

  1. k를 선언할 때 반복문 안에서 선언하니 반복할 때마다 초기화 되었다 반복문의 스코프는 반복할 때마다 초기화 되는 것으로 예상됨
  2. 콜백에 if가 참 일 때만 내가 원하는 결과를 가지는 그런 복잡한 것들은 안된다 아직 내 수준에서는 그냥 간단한 식에서만 쓰자

 

 

 

 

마지막으로 모범코드이다 왜 저런 생각을 못했을까 

function solution(emergency) {
    let sorted = emergency.slice().sort((a,b)=>b-a); // slice() 새로운 배열 만들기
    return emergency.map(v=>sorted.indexOf(v)+1); // map()으로 맞는 인덱스를 가져와 채운다
}