멀쩡한 사각형

Happhee·2022년 2월 2일
0

[ Lv2 ] programmers

목록 보기
8/32
post-thumbnail

📝 멀쩡한 사각형

🖥 나의 JS 코드

처음에는 대각선을 지나는 모든 점의 좌표를 배열에 담아서 해당배열을 반복문으로 돌렸다
하지만, 시간초과로 인해 이는 적절한 방법이 아님을 알았다
따라서 배열에 값을 저장하는 방식 말고, 그때마다 값을 구해서 이를 결과에 반영하는 식으로 로직을 구현하였다

👇 정확도 문제가 발생한 부분의 코드

 	front_y = (-1)*(h/w)*i + h;
    end_y = (-1)*(h/w)*(i+1) + h;

다만, 테스트 6에서만 오류가 발생하여 한참을 생각하다 해당 부분에서 나누기 연산을 마지막으로 진행하여 정확도를 높였더니 통과되었다


첫번째 시도

최종적인 코드는 다음과 같다

function solution(w, h) {
    let answer =0, front_y, end_y;
   
  // 가로의 길이만큼 수행
    for(let i = 0 ; i < w ; i++){
      
      // 나누기 연산을 마지막에서 진행
        front_y = (-1)*(h)*i/w + h;
        end_y = (-1)*(h)*(i+1)/w + h;
      
      // 시작하는 좌표는 소수면 반올림, 정수면 그값 그대로
      const front = Math.floor(front_y) < front_y ? Math.floor(front_y)+1 : front_y;
      
      // 끝나는 좌표는 소수면 내림, 정수면 그 값 그대로   
      const end = Math.floor(end_y) < end_y ? Math.floor(end_y) : end_y;
      
      // 이를 뺀값이 곧 사용할 수없는 사각형의 개수이다
      answer += (front-end)
    }
  // 전체 사각형 개수에서 answer의 값을 빼서 반환
    return w*h - answer;
}

두번째 시도

function solution(w, h) {
    
    let answer = 0;
    for(let x = 1 ; x <= w ; x++){
        const front_y = (-1)*(h) * (x-1) /w + h;
        const end_y = (-1)*(h) * x /w + h;
      // 소수점의 삼항연산 없이 ceil, floor로 진행
        answer += (Math.ceil(front_y) - Math.floor(end_y));
    }
   
    return w*h - answer;
}

그런데 리턴부분에서 소수점올림과 내림값을 answer에 더하는 것이 아니라 result = w * h 로 두고 여기서 차이를 빼가는 방식으로 진행하고 마지막을 return result를 하면 통과가 되지 않는다
이유가 무엇일까,,?

profile
즐기면서 정확하게 나아가는 웹프론트엔드 개발자 https://happhee-dev.tistory.com/ 로 이전하였습니다

0개의 댓글