[CodingTest] 직사각형의 한점 좌표값 유추하기


문제

직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구해 전체 좌표값들을 구해야한다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때( v = [[x축 좌표, y축 좌표], … ] ), 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성하라. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어짐. 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return.

입출력 예

insert result
[[1, 4], [3, 4], [3, 10]] [1, 10]
[[1, 1], [2, 2], [1, 2]] [2, 1]

내가 작성한 답안

function solution(v) {
    const rangeX = [
            Math.max(v[0][0],v[1][0],v[2][0]), 
            Math.min(v[0][0],v[1][0],v[2][0])
        ],
        rangeY = [
            Math.max(v[0][1],v[1][1],v[2][1]), 
            Math.min(v[0][1],v[1][1],v[2][1])
        ],
        stringfiedResult = [
            JSON.stringify([rangeX[0], rangeY[0]]),
            JSON.stringify([rangeX[0], rangeY[1]]),
            JSON.stringify([rangeX[1], rangeY[0]]),
            JSON.stringify([rangeX[1], rangeY[1]])
        ],
        stringfiedV = [
            JSON.stringify(v[0]), 
            JSON.stringify(v[1]),
            JSON.stringify(v[2])
        ];
    let answer
    stringfiedResult.map(val => {
        if(stringfiedV.indexOf(val) == -1) {
            console.log("val : ", val)
            answer = JSON.parse(val)
        }
    })
    return answer
}

내 답안풀이

직사각형이라면 모든 좌표들의 x축값은 a와 b 둘 중 하나이고 y축값 역시 c,d 둘 중 하나라고 생각했다. 그래서

[a,c], [b,c], 
[a,d], [b,d]

의 형태일거라고 생각했다.

그래서 세 점의 좌표값들중 x축값들의 최소값, 최대값이 a와 b이고 => rangeX
y축값들의 최소값, 최대값이 c와 d이다. => rangeY

stringfiedResult는 그값들의 좌표값들이다. stringfiedResult에서 없는 좌표값을 찾는 것이 내가 생각한 답이었다.

다른 사람들의 풀이

YanghaKoo 님이 푸신 식을 보면 더 간단하다.

function solution(v) {
  var a = {}
  var b = {}
  const answer = []
  
  v.forEach(r => {
    if(a[r[0]]){
      a[r[0]] = a[r[0]] +1
    }else{
      a[r[0]] = 1
    }

    if(b[r[1]]){
      b[r[1]] = b[r[1]] +1
    }else{
      b[r[1]] = 1
    }
  });

  for(var i in a){
    if(a[i] === 1) {
      answer.push(Number(i))
      break;
    }
  }
  
  for(var i in b){
    if(b[i] === 1) {
      answer.push(Number(i))
      break;
    }
  }

  return answer
}

연산

v = [[1,4], [3,4], [3,10]]
r a b
[1,4]일때 {“1”:1} {“4”: 1}
[3,4]일때 {“1”:1, “3”:1} {“4”: 2}
[3,10]일때 {“1”:1, “3”:2} {“4”: 1, “10”: 1}

연결배열로 input 값으로 주어진 각 숫자들의 출현빈도를 뽑고
뽑은 것들중 1번 출현한 숫자의 x,y축 값을 리턴하여 답을 내고 있다.

내 답의 경우 JSON.stringfy 매서드로 배열을 문자화시켜 그것들을 비교하고 있다.
문자화 연산의 비용을 고려하자면 연결배열로 문제를 해결하는 방법이 효율적이다.

실제 jsben.ch에서 테스트해본결과 내 로직보다 50% 더 효율적이었다.





2023

Flutter 맛보기 1

3 분 소요

직방 기술지원팀 기술공유 세미나 중 플러터를 소개한 내용입니다

Back to Top ↑

2022

Back to Top ↑

2019

[Tutorial] Storybook과 Bit을 활용한 UI 컴포넌트 관리(Workflow)

1 분 소요

회사에서 프론트엔드 개발원칙을 SFC(Single File Component)에서 UI 컴포넌트를 기준으로 CDD(Component Driven Development)를 진행하려고 한다. 그래서 체계적으로 관리하기위해 Storybook과 Bit을 도입해보고자 한다. 각각의 역할은 ...

[Workflow] 프론트엔드 개발조직을 위한 워크플로 설계

2 분 소요

작성 배경 회사의 작업구조를 페이지 중심 개발에서 UI 컴포넌트 중심 개발로 변경하면서 Workflow를 개선할만한 환경을 구성해야했다. 폐쇄망 기반에서 개발자간 UI 명세서 역할을 할 수 있는 Storybook과 그것을 공유할 Verdaccio라는 구축형 NPM Pri...

[ESlint & Prettier] 개발 관습 설정 in Visual Studio

1 분 소요

회사 프로젝트를 작업하기 전 프론트엔드 개발자들 간의 코드 규칙을 Eslint와 Prettier 설정을 맞춰 관리해가는 방향을 정했다. 아직 협업을 할 경우는 없지만 미래에 인수인계 받거나 협업을 진행할 경우 코드관습이 달라 고생할 경우를 대비하기로 했다. 설정은 작업을 진행하며 ...

[CodingTest] 2019-10-26 SQL문제

최대 1 분 소요

공부겸 코딩테스트 사이트에서 토요일 오전 10시에 백엔드 포지션 테스트를 해준다기에 참여해봤다. SQL문제가 나왔는데 더 좋은 답이 있는것 같아 나중에 기록해두고 수정해보기로 한다.

[CodingTest] 피보나치 수열

1 분 소요

문제 : 피보나치 수열 제 1항부터 입력한 자연수(N)까지의 피보나치 수열 항들의 합을 구하여라.

[Syntax] 새로 알게된 파이썬 문법 정리

최대 1 분 소요

chaning comparison 파이썬은 chaning comparison이라는 신기한 문법이 있다. 참고 if a < b and b < c : (...) 라는 구문이 if a < b < c : (...) 으로 연산된다. 직관적인 문법이 인상적. ...

[DataType] Map & Set

최대 1 분 소요

Set vs Array - 관련기사 Set 유일값들의 배열이 필요할때(distinct) 집합의 개념이 필요할때(차집합, 교집합 등등 자체 메서드들이 많음.) index가 필요 없을때 Array에서 중복값을 없앨때 => ...

Back to Top ↑

2018

SGIS-shpToGeojson

1 분 소요

SGIS에서 받은 지도데이터(.shp)를 geojson으로 변경하는 작업 내용

Back to Top ↑