0428-Programmers-and-Rest

오늘 몸이 별로 안 좋아서 이상하게 계속 어깨랑 허리가 아파서 이 문제들만 풀고 쉬었는데 흠 …
운동을 해야겠다 ‘ㅁ’;

아쉽다 문제 3번째 문제에서 좀 오래걸리고 결국 100 100 100을 못했다.

Programmers

  • 1번문제

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    문제는 가장 많은 부서들에게 예산을 나눠줄 수 있는 숫자를 return 하는 함수를 구하는 거였다. 
    그래서 sort -> 작은 값들 부터 budget에 빼주면서 못 빼주는 경우 그 때까지 세준 count를 return하게 풀어줬다

    function solution(d, budget) {
    let count = 0;
    let budgetList = d.sort((a,b)=>a-b);
    for(let i =0, {length} = budgetList; i<length; i++){
    if(budget-budgetList[i]>=0){
    budget-=budgetList[i]
    count+=1
    }
    else break;
    }
    return count;
    }

    console.log(solution([20,200,10,1,2,3,4,5], 30))
  • 2번문제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 영어 끝말잇기 
// 가장 먼저 탈락하는 사람의 번호와 그 사람이
// 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
// 설계

// 탈락의 경우의 수
// 끝 글자가 같지 않은 경우
// 같은 문자를 다시 말한 경우

-> 같은 문자를 기록
-> lastChar를 기록 해서 순회하면서 if문 비교


function solution(n, words) {
let answer = [];

let lastChar=words[0][words[0].length-1];
const usedWords = new Set ([words[0]])

for(let i =1, {length} = words; i<length; i++){
if(lastChar!==words[i][0] || usedWords.has(words[i])){
let peopleNumber = (i+1)%n=== 0 ? n: (i+1)%n
let count = Math.ceil((i+1)/n)
answer.push(peopleNumber, count)
break;
}else{
lastChar = words[i][words[i].length-1]
usedWords.add(words[i])
}

}
if(answer.length===0) answer = [0,0]

return answer;
}
solution(3,['tank','kick','know', 'wheel', 'land', 'dream', 'mother', 'robot', 'tank'])
  • 3번문제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

랜덤하게 자연수 숫자들을 받음 A,B
A-> 랜덤하게 섞고 내보냄 ->
B는 이것을 보고 가장 많은 점수를 낼 수 있는 조합으로 섞음 ->
B의 가장 높은 점수를 내는 함수를 구하시오

아쉬움
1. 접근한 방법 sort -> sort B 의 작은 값부터 A의 가장 작은값보다 크면 같이 없애주고 bScore을 증가 시켜준다
splice로 해당 값이 나오면 뺴줘서 결국 다 돌게 하기

이 부분 시간 복잡도에서 안 좋은 점수를 받았다. 그래서 결국 85

function solution(A, B) {
A.sort((a,b)=>a-b);
B.sort((a,b)=>a-b);
let bScore = 0;
for(let i =0, {length}=B; i<length; i++){
for(let j=0, {length}=A; j<length; j++){
if(B[i]>A[j]){
B.splice(i,1)
A.splice(j,1)
bScore+=1
i=i-1;
break;
}
}
}
return bScore;
}
solution([5,1,3,7],[2,2,6,8]);
solution([6, 1, 6, 7],[3, 1, 3, 3]);

//splice로 하나씩 짜르는 것보단 이렇게 하는 것이 날 것 같다.
B = B.slice(i+1,initLength)
A = A.slice(j+1,initLength)
bScore+=1
i=j=-1

// ETC
// 아무튼 뭔가 for -for문에 slice잘 못 풀은 느낌
1. 만약에 A는 그냥 주어지고 B배열을 섞어서 ,B배열과 B의 가장 높은 점수를 구하라는 문제로 나올 수도 있겠다

피드…

내일 알바하고 나서 부터 다시 열심히 살겠습니다 :D
방학 기분을 냈습니다요
알고리즘 평소에 열심히 연습해야겠다