이번에도 그리디 문제를 중점적으로 풀어봤다
접근법 : 들어온 값이 N이라고 하면 3A + 5B = N이라고 식을 만들어 줄 수 있다. 여기서 가장 해가 가장 작은 값이 나오려면 5B에 나눠떨어지는 값이 나와야 하므로 A의 값을 5로 나눠떨어질때까지 증가시키는 코드를 작성하면 된다.
해결법 : 일단 반복문에서 조건식을 빼고 생각해보면 어떤 수가 주어졌을때 숫자에 3을 빼고 cnt(카운트)를 올린다. 만약 3을 쭉쭉 빼나가다가 num이 0이 되었거나 num이 5의 배수가 된다면 num을 5로 나눈 몫을 현 카운트에 더해준다. 만약 쭉쭉 빼나가다가 num이 0보다 작아질시 cnt는 -1이 된다.
원래 내 코드
접근법 : 마지막 숫자부터 2를 나눌수 있거나 1의 자리가 1이라면 2로 나눈몫, 1을 제외한 값을 계속 만들면서 카운트를 증가했다.
해결법 : 내가 생각한 방법이 맞았는데 내가 처음에 쓴 코드를 보면,
(endnum [endnum. length - 11 == '1'){
endnum = endnum. slice (0, -1)
console. log (endnum)
cnt++
endnum을 문자열로 취급하고 마지막 글자가 1이냐라고 생각했는데 그냥 10으로 나눠서 나머지가 1이냐라고 쓰는게 더 편하고 직관적으로 보여서 수정했다.
문제 (다시풀기!)
접근법 : 지금까지 풀었던 문제들은 전부 테스트 케이스가 하나라서 직관적으로 어디서 부터 어디까지 반복문을 사용해서 풀었는데, 이렇게 테스트케이스가 여러개 주어진 경우 반복문의 범위를 어디서부터 어디까지 설정해줘야 할지 감이 안왔다. 30분동안 생각을 해봤지만 도저히 생각이 안나서 솔루션을 보고 전체 코드말고 테스트 케이스에 대한 반복문만 구조를 짜놨다. 이렇게 아예 생각이 안난건 처음이라 많이 아쉽지만 머릿속에 로직을 잘 넣어놔서 나중에 문제를 풀 때 바로바로 생각날 수 있도록 저장해놔야겠다.
해결법 :
1️⃣ 테스트케이스(작은반복문을)을 몇번 실행할거냐 = num
따라서 for (let i = 0; i < num; i++); -> 여기까진 쉽다.
2️⃣ 시작 라인 line=1을 설정한다.
3️⃣ let n = Number (input line) 테스트케이스는 첫째줄에 사원 수를 받는다.
4️⃣ 이제 작은 반복문을 실행하면 되는데 첫째줄에는 항상 사원 수를 받으므로 실질적으로 처음 실행되는 코드는 line+1이 된다. 그리고 끝나는 지점은 line+n
5️⃣마지막으로 line+n+1로 line의 위치를 다음 사원수를 받을 수 있도록 만들어준다.
즉 정리하면 항상 처음 시작은 1번 라인부터 시작이므로 일단 line=1로 설정하고, 그 위치에 사원수를 받고 그 위치+1로 시작해서 위치+사원수로 반복문을 설정하고, 반복문이 끝나면 라인 + 사원수 + 1로 다음 사원수를 받을 수 있도록 설정
위에 짜놓은 기본구조에 작은 반복문은 빈배열에 서류점수 면접점수를 넣는다.
그리고 만들어진 배열의 서류점수를 오름차순으로 만들고 서류점수 1등의 면접순위보다 높은 값들을 찾는다.
for of 문법에서는 이차원 배열이므로 원소에 [] 로 접근 할 수 있게 해줬다.