Programmers Level 01 - 1

Seungju Hwang·2021년 5월 5일
0

algorithm

목록 보기
14/14
post-thumbnail

JavaScript

💥 문제 풀면서 알게 된 JS문법

  1. .reduce((acc,cur) => acc+cur,0)
    이거 통해서 배열에서 -> 개수딕셔너리를 만들 수 있어요!!!
  2. .sort((a,b)=>a-b)
  3. .findIndex(판별함수)
    판별함수 예를 들어 (r => r>10)를 만족하는 r의 인덱스를 찾아줍니다. 없으면 -1


📌 완주하지 못한 선수

아이디어

마라톤 참가자 명단 array1 , 완주자 명단 array2 가 존재합니다. 참가자 중엔 동명이인이 존재해요.
참가자 명단을 일단 객체로 만들어 주는 게 좋을 거 같아요(동명이인이 존재하니까)
{ 'a':2, 'b':1,'c':1} 이런식으로요.
그리고나서 완주자 명단을 for문을 통해 명단 객체를 돌면서 다 확인해줍시다. (존재하면 명단에서 한명씩 빼는거죠)
이렇게 하면 최종적으로 한명만 남겠네요.

코드

function solution(participant,completion){
  var answer = ''  
  let obj = participant.reduce((po,p)=>{
    	po[p] = po[p] ? po[p] + 1 : 1;
    	return po
    },{})
    
    completion.forEach(c=>{
    	if(obj[c] && obj[c]===1){
        	delete obj[c];
        }else if(obj[c] && obj[c]!==1){
        	obj[c] -= 1;
        }
    })
  answer = Object.keys(obj)[0]
  return answer
}


📌 K번째 수

아이디어

commands 배열이 중요하네요. 이걸 기준으로 for문을 돌리서 각각의 command에 맞게끔 array에서 값들만 뽑아내면 될 거 같아요.
💥 여기서 sort 메서드 쓰려면요. 오름차순일 경우 .sort((a,b) => a-b) 이렇게 해줘야 합니다..기본중의 기본!!

코드

function solution(array,commands){
  var answer= [];
  commands.forEach(command=>{
  	let temp =[]
    array.forEach((a,idx) => {
    	if(idx>=command[0]-1 && idx<=command[1]-1){
        	temp.push(a);
        }
    })
    temp.sort((a,b) => a-b);
    answer.push(temp[command[2]-1);
  })
  return answer;
}


📌 체육복

아이디어

  1. 전체 학생들 중에서 잃어버린 사람의 수를 빼면 기본적으로 체육복을 입은 사람입니다.
  2. 내껀 잃어버렸는데, 여벌을 가지고 있는 학생들은 먼저 자기 여벌을 먼저 입겠죠. 이거 체크 해줍시다.
    💥 filter 메서드를 써줘요. 잃어버린 사람들 중에서 여벌이 있는 지 체크를 해요. 여벌이 없으면 잃어버린 사람은 잃어버린 배열에 그대로 들어가구요. 여벌이 있는 사람은 여벌 배열에서 뺴요!
  3. 여벌있는 사람들한테 -1,+1 번호 해서 옷을 주워입읍시다.

코드

function solution(n,lost,reserve){
  var answer = 0;
  //1. 일단 가지고 있는 사람
  answer = n - lost.length;
  
  //2. 내꺼부터입자
  lost = lost.filter(l=>{
    let idx = reserve.findIndex(r => r===l);
    if(idx===-1){
      return l
    }else{
      reserve.splice(idx,1)
      answer+=1;
    }
  })
  
  lost.forEach(l=>{
    const a = l+1;
    const b = l-1;
    
    for(let i =0;i<reserve.length;i++){
      if(a===reserve[i] || b===reserve[i]){
        answer += 1
        reserve.splice(i,1)
        break;
      }
    }
  });
};


📌 키패드 누르기


오 이문제 어렵... 레벨1인데.. 어렵...

아이디어

  1. 핸드폰의 좌표를 미리 정의하자 !
  2. 현재 오른쪽 손과 왼쪽손이 어디에 위치하는 지 기록하자!
  3. 가운데 라인일 경우, 현재 손 위치와의 거리를 구해서 비교하자!

코드

function solution(numbers, hand) {
    
    function find(num,lH,rH){
        const lD = Math.abs(phone[lH][0]-phone[num][0]) + Math.abs(phone[lH][1]-phone[num][1])
        const rD = Math.abs(phone[rH][0]-phone[num][0]) + Math.abs(phone[rH][1]-phone[num][1])
        
        if(lD===rD) return hand==='left'?'L':'R';
        return lD<rD ? 'L':'R';
    }
    const phone = {
        1:[0,0],2:[0,1],3:[0,2],
        4:[1,0],5:[1,1],6:[1,2],
        7:[2,0],8:[2,1],9:[2,2],
        '*':[3,0],0:[3,1],'#':[3,2]
    }
    
    let lH = '*'
    let rH = '#'
    let result = ''
    for(let num of numbers){
        if(num%3===1){
            result += 'L'
            lH=num
        }else if (num!==0 && num%3===0){
            result += 'R'
            rH=num
        }else{
            result += find(num,lH,rH)
            result[result.length-1]==='L'?lH=num:rH=num;
        }
    }
    
    return result;
}


profile
기록하는 습관은 쉽게 무너지지 않아요.

0개의 댓글