TIL 20221201 - 149번

hoin_lee·2022년 12월 1일
0

TIL

목록 보기
114/236

오늘 공부

알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm

JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS

React 강의 듣기
https://github.com/hoinlee-moi/React_prac


오늘 원래 리액트 강의를 쭉 들으려고 했는데 알고리즘 문제에서 숨이 턱 막혀서
진행을 많이 못했다.
이따가 남은시간 전부 리액트 강의 듣는데 써야겠다

오늘 알고리즘

키패드 누르기

오늘은 완전 하드 코딩을 했는데 그 결과물..

function solution(numbers, hand) {
    let answer = "";
    const leftNum = [1,4,7]
    const rightNum = [3,6,9]
    const middleNum = [2,5,8,0]
    const two = [[2],[1,3,5],[4,6,8],[7,9,0],["#","*"]]
    const five = [[5],[2,4,6,8],[1,3,7,9,0],["#","*"]]
    const eight = [[8],[0,5,7,9],["#","*",2,4,6],[1,3]]
    const zero = [[0],["#","*",8],[5,7,9],[2,4,6],[1,3]]
    let leftLocation = "*";
    let rightLocation = "#";
    let leftDistance = 0;
    let rightDistance = 0;
    for(let i=0; i<=numbers.length-1;i++){
        if(leftNum.includes(numbers[i])) {
            answer+="L"
            leftLocation = numbers[i]
            continue;
        }
        if(rightNum.includes(numbers[i])) {
            answer+="R"
            rightLocation = numbers[i]
            continue;
        }
        if(middleNum.includes(numbers[i])){
            if(numbers[i]===2) {
                two.forEach((val,i)=>{
                    if(val.includes(leftLocation)) leftDistance = i
                    if(val.includes(rightLocation)) rightDistance = i
                })
            }
            if(numbers[i]===5) {
                five.forEach((val,i)=>{
                    if(val.includes(leftLocation)) leftDistance = i
                    if(val.includes(rightLocation)) rightDistance = i
                }) 
            }
            if(numbers[i]===8) {
                eight.forEach((val,i)=>{
                    if(val.includes(leftLocation)) leftDistance = i
                    if(val.includes(rightLocation)) rightDistance = i
                }) 
            }
            if(numbers[i]===0) {
                zero.forEach((val,i)=>{
                    if(val.includes(leftLocation)) leftDistance = i
                    if(val.includes(rightLocation)) rightDistance = i
                }) 
            }
            
            if(leftDistance===rightDistance) {
                if(hand==="right"){
                    answer+="R"
                    rightLocation = numbers[i]
                }else{
                    answer+="L"
                    leftLocation = numbers[i]
                }
            }
            if(leftDistance>rightDistance){
                answer+="R"
                rightLocation = numbers[i]
            } else if(leftDistance<rightDistance){
                answer+="L"
                leftLocation = numbers[i]
            }
        }
    }    
    return answer;
}
  • 각 왼손 오른손 마다 누르는 번호를 따로 변수에 저장한다.
  • 2차원 배열을 이용해 중간 번호들의 거리별 번호를 따로 변수에 저장한다.
  • 번호를 반복문으로 돌며 각 번호에 맞는 방향을 입력하도록 한다.

정말 1차원적인 코딩이고 다 정해 놓은 느낌이다.
노가다 코딩이라고도 볼 수 있고 다른 사람 풀이를 보니 좌표를 이용해 푼사람도 있었다.
또 다른 풀이를 보자면

function solution(numbers, hand) {
  hand = hand[0] === "r" ? "R" : "L"
  let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]
  let h = { L: [1, 1], R: [1, 1] }
  return numbers.map(x => {
    if (/[147]/.test(x)) {
      h.L = [position[x], 1]
      return "L"
    }
    if (/[369]/.test(x)) {
      h.R = [position[x], 1]
      return "R"
    }
    let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
    let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
    if (distL === distR) {
      h[hand] = [position[x], 0]
      return hand
    }
    if (distL < distR) {
      h.L = [position[x], 0]
      return "L"
    }
    h.R = [position[x], 0]
    return "R"
  }).join("")
}

한 번 차근차근 뜯어봐야겠다

profile
https://mo-i-programmers.tistory.com/

0개의 댓글