프로그래머스 : 교점에 별 만들기

KHW·2021년 10월 14일
0

코딩테스트

목록 보기
9/17
post-custom-banner

문제

100/100
1시간 소요

기본적인 내용

  1. 교점찾기
  2. 교점에 따르는 최소 결과 영역 찾기
  3. 중복되는 교점 처리하기
  4. 같은 값을 가진 배열값은 없다 => 있다면 교점이 수도 없으니 결과가 나올수없다

알아야 할 것

10/0 => Infinity
-10/0 => -Infinity
0/0 => NaN
Number.isInteger(Infinity) => false
Number.isInteger(-Infinity) => false
Number.isInteger(NaN) => false

결과 코드

function calculate(firstLine,secondLine){
    const [A,B,E] = firstLine;
    const [C,D,F] = secondLine;
    
    let X = (B*F-E*D) / (A*D - B*C)
    let Y = (E*C-A*F) / (A*D - B*C)

    if(Number.isInteger(X) && Number.isInteger(Y))
        return {X,Y}
    
    return undefined
}

function solution(line) {
    var answer = [];
    let point = [];
    let calculateResult
    const line_length = line.length;
    
    // 1. 정수 포인트 지점찾기
    for(let i=0;i<line_length;i++){
        for(let j=i+1;j<line_length;j++){
            calculateResult =calculate(line[i],line[j])
            // calculate return이 없을경우 undefined일 경우 해당 부분은 if문이 성공X
            if(calculateResult)
               point.push(JSON.stringify(calculateResult))
        }
    }
    
    // 2. 중복 부분 처리 ex)4번 입출력 
    let set = Array.from(new Set(point))
    set = set.map(val=>{
        return JSON.parse(val)
    })
    
    
    //3. 만들 최소영역 찾기
    let maxWidth=-Infinity,minWidth=Infinity,maxHeight=-Infinity,minHeight=Infinity
    
    set.map(obj=>{
        maxWidth = Math.max(maxWidth, obj.X)
        minWidth = Math.min(minWidth, obj.X)
        maxHeight = Math.max(maxHeight, obj.Y)
        minHeight = Math.min(minHeight, obj.Y)
    })
    
    let str = ''
    let findValue
    
    //4. 영역에 따르는 결과 찾기
    //y위에서부터 아래로 체크 시작 
    for(let y=maxHeight;y>=minHeight;y--){
        str = ''
        //x위에서부터 오른쪽으로 체크 시작
        for(let x=minWidth;x<=maxWidth;x++){
            //교점이 있다면 존재하는 값을 리턴
            findValue = set.filter((element)=>{
                return (element.X === x && element.Y === y)
            })
            if(findValue.length !== 0)
                str = str.concat('*')
            else
                str = str.concat('.')
        }
        //모은 *.합을 push 
        answer.push(str);
    }
    return answer
}

주요부분

  1. 정수 포인트 지점찾기
  2. 중복 부분 처리
  3. 만들 최소영역 찾기
  4. 영역에 따르는 결과 찾기

다른 사람 코드

  • 무호님
function solution(line) {
  let [minX, maxX] = [Infinity, -Infinity];
  let [minY, maxY] = [Infinity, -Infinity];
  const intersectionPoints = _getIntersectionPoints(line);

  return _draw(intersectionPoints);

  function _getIntersectionPoints(line) {
    const intersectionPoints = {};
    for (let i = 0; i < line.length; i++) {
      for (let j = i + 1; j < line.length; j++) {
        const [A, B, E] = line[i];
        const [C, D, F] = line[j];
        const [x, y] = [
          (B * F - E * D) / (A * D - B * C),
          (E * C - A * F) / (A * D - B * C),
        ];
        if (A * D - B * C && Number.isInteger(x) && Number.isInteger(y)) {
          [minX, maxX] = [Math.min(minX, x), Math.max(maxX, x)];
          [minY, maxY] = [Math.min(minY, y), Math.max(maxY, y)];
          intersectionPoints[`${[x, y]}`] = true; //stringify
        }
      }
    }
    return intersectionPoints;
  }

  function _draw(intersectionPoints) {
    const drawStack = [];
    for (let i = maxY; i >= minY; i--) {
      let row = '';
      for (let j = minX; j <= maxX; j++) {
        const rowElement = intersectionPoints[`${j},${i}`] ? '*' : '.';
        row += rowElement;
      }
      drawStack.push(row);
    }
    return drawStack;
  }
}
  1. 코드수가 확실히 적다.
  2. 내부함수로 내부에서만 쓰일 함수를 지정해 놓았다.
  3. 내부함수에는 _를 앞에 붙였다.
  4. [${[x, y]}]를 이용했다.
  5. Hash map을 이용하여 교점이 중복될 때 중복을 해결해준다.
    (같은 부분을 결국 true로 설정하니)
    이부분이 나처럼 배열로 했을때 new Set을 쓰지않고 풀 수 있는 부분이다.

백틱${ 값 }백틱 , 백틱${배열}백틱

const a=10,b=20,c=30,d=40
const x = `${a,b,c,d}`, y = `${[a,b,c,d]}`, z = `${a+b+c+d}`
x	//'40'
y	//'10,20,30,40'
z	//'100'

값만 ,를 통해 입력할경우 마지막 값만 적용되고
+로 나누었을때는 값을 계산후 결과가 나오고
해당 부분을 배열로 만들면 전부 ,를 통해 구분되며 나타난다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자
post-custom-banner

0개의 댓글