toy 21

이영광·2021년 10월 2일
0

알고리즘

목록 보기
16/16

문제
아래와 같은 과정을 거쳐 부등호 수(inequalityNumber)를 만들 수 있습니다.

최대 9개의 부등호(<, >)가 주어집니다.
부등호의 좌우에는 0부터 9사이의 숫자가 한 번씩만 들어가야 합니다.
부등호를 만족하는 숫자의 조합을 차례대로 이어 붙여 만든 정수를 부등호 수라고 한다.
부등호 기호들을 입력받아 부등호를 만족하는 최대 부등호 수와 최소 부등호 수의 차이를 리턴해야 합니다.

주의사항

첫 자리가 0인 경우도 부등호 수에 포함되어야 합니다.
모든 입력에 답은 항상 존재합니다.

입출력 예시
let output = inequalityNumber('<');
console.log(output); // --> 88 (89 - 01)

output = inequalityNumber('< >');
console.log(output); // --> 876 (897 - 021)

output = inequalityNumber('> < >');
console.log(output); // --> 8,754 (9,786 - 1,032)

부등호 < 가 있다면 왼쪽에는 작은수 오른쪽은 큰수 가와야되는데

최소의 수와
최대의 수를 구한다음 최대의수에서 최소를 뺀수를 리턴을 해줘야한다

부등호 < 가있다면 최소라면 0 < 1 이고 리턴될 수는 1이 리턴이 되야되고
큰수로는 8<9 로 89가 리턴이 되어야한다 89-1을 뺀수를 결과적으로 리턴되면 된다

< > 가 있다면 제일작은수를 구할때는 0~9까지 중 제일작은수가 가장왼족이 와야되고
중간은 가장큰수 왼쪽은 그다음 수가 와야될것이다
0 < 1 >2가 온다면 설정상맞지않고 0<2>1이 와야되면 리턴될숫자는 21이다
큰수를 구할때는

8<9>7이 되어야할것이다

로직은 min과 max를 따로구할 함수를 만들어주고 min에는 차례대로 넣어주고 max에는 reverse() 함수를 이용 해서 큰수부터 구할수있게 만들어준다

재귀를 이용해서 bucket에 리턴해줄 숫자를 콘캣으로 붙여주고 사용된숫자를 확인해줄 배열을 넣어준다 처음 수를 버켓에 넣어주기위해 인덱스 -1넣어 조건을 무시할수있게 만들어주고 그다음부터
조건을 비교해볼수있도록 idx 에 +1을 해준다

idx = 부등호의 갯수를 구할때 쓰는것



if(sign === '<' && left >= right) continue
if(sign === '>' && left <= right) continue
<일때는 left가 크면 안된다 레프트가 크다면 바로 패스이다
> 당연히 오른쪽이 크면안된다 패스
= 숫자는 하나만 사용되야되기때문에 같은수자는 올수없다 
const inequalityNumber = function (signs) {

  const aux =(idx,sings,bucket,digits,isVisited)=>{
    if(idx === signs.length){ //부등호를 전부 구했을때
      return parseInt(bucket.join(''))
    }

    const sign = signs[idx]//부등호선택
    
    for(let n = 0 ; n<arr.length ; n++){
      const right = arr[n]
      if(isVisited[right]) continue

      if(idx >= 0){//처음 -1일때는 건너띈다 0부터 조건을 비교해본다
        const left = bucket[bucket.length-1]
        if( sign === '<' && left>=right) continue
        if( sign === '>' && left<=right) continue
      }
      isVisited[right] = true
      const target = aux(idx+1,signs,bucket.concat(right),arr,isVisited)

      if(target !== undefined) return target

      isVisited[right] = false//타겟이 언디파인드라면 다시 돌려놈
    }
    return undefined

  }
  signs = signs.split(' ')
  const arr = [0,1,2,3,4,5,6,7,8,9]
  const min = aux(-1, signs,[],arr,new Array(10).fill(false))
  const max = aux(-1, signs,[],arr.reverse(),new Array(10).fill(false))
  return max - min
};
profile
《REACT》《JAVASCRIPT 》 만지고있어욤

0개의 댓글