코딩테스트 Lv - 1 대충 만든 자판

박상하·2024년 8월 7일
0

코딩테스트

목록 보기
36/37


keymap의 길이는 자판의 개수라고 생각하면된다.
각각 자판을 누를때마다 연속적으로 어떤 문자가 나오는지를 담고있다.

첫 번째 시도

최소로 누르고 싶은거니까 keymap에 있는 문자는 굳이 구별을 하지 않아도 된다고 생각한다.

keymap[0]이든 keymap[1]이든 빨리 해당 문자가 나오는걸 연속으로 누르면된다.

그럼 같은 문자를 보여주는 다른 자판이라도 문자를 빨리 보여주는 횟수만 저장하면된다.

예를 들어 [ABACD][BCEFD]가 있을때
C를 뽑기위해 가장 빠른 자판의 횟수는 2이다.

그냥 C는 2번 누르면된다라고 저장할 수 있다.

이를 위해 Hash를 사용했다.

function solution(keymap, targets) {
  const hash = new Map()
  keymap = keymap.map((string)=>(string.split(``)))  
  keymap.forEach((arr)=>arr.forEach((char,i)=>{
      if(!hash.get(char) || hash.get(char)>i+1){
          hash.set(char,i+1)
      }
  }))
  const result=[]
  for(let i = 0 ; i <targets.length; i++){
      let sum=0
      for(let j = 0 ; j<targets[i].length; j++){
          const char = targets[i][j]
          if(!hash.get(char)){
              return [-1]
          }
          sum=sum+hash.get(char)
      }
      result.push(sum)  
  }
    
    return result
}

이렇게 각 자판을 구별하지 않고 해당 문자를 최소로 눌렀을때 나올 수 있는 수를 key-value로 저장하였다.

이런식으로.

결과: 실패

절반의 테스트 케이스를 통과하지 못했다.

자세히 보니 문제를 잘못 읽었다.

문제를 제대로 읽는 것이 중요하다

만약 찾는 문자가 없을때 [-1]을 반환하는 것이 아닌 해당 target에 대해서 -1을 result 배열에 저장해서 Return하는 문제였다.

두 번째 시도

function solution(keymap, targets) {
  const hash = new Map()
  keymap = keymap.map((string)=>(string.split(``)))  
  keymap.forEach((arr)=>arr.forEach((char,i)=>{
      if(!hash.get(char) || hash.get(char)>i+1){
          hash.set(char,i+1)
      }
  }))
  const result=[]
  for(let i = 0 ; i <targets.length; i++){
      let sum=0
      for(let j = 0 ; j<targets[i].length; j++){
          const char = targets[i][j]
          if(!hash.get(char)){
               sum=-1
              break;
          }
          sum=sum+hash.get(char)
      }
      result.push(sum)  
  }
  
    return result
}

결과: 성공

0개의 댓글