본문 바로가기
Algorithm

99클럽 코테 스터디 10일차 TIL - 평행선(백준 2358 / JavaScript)

by 륜곰 2025. 4. 14.

문제 출처

 

⭐ intro : 문제를 생각해나간 방식

꽤나 머리를 싸멨던 문제였다. 평행하는 선 좌표는 x,y 중에서 뭔가 공통된게 있을까 싶었는데, 이미 질문을 내린 시점에서 답을 알고 있었다. x축에 평행한 선은 x값이 어떻든간에 상관없이 y값이 동일하기만 하면 하나의 평행한 선이 이어지게 된다. 그리고 문제에서 같은 좌표가 여러번 주어질 수 있다는것은 중복을 허용한다는 뜻으로 y값이 동일한 값 2개 이상을 찾아내면 x축에 평행한 선의 갯수를 만나게 된다. 반대로 y축에 평행한 선은 위와 마찬가지 로직으로 x값이 동일한 값 2개 이상을 찾아내면 y축에 평행한 선의 갯수를 만나게 된다. 그렇지만 로직이 서로 반대축을 바라보고 있지만 서로 똑같은 축의 값을 동일하게 가져가는 횟수는 동일하므로, 코드의 통일성으로 x값에 대응하는 똑같은 'x값', y값에 대응하는 똑같은 'y값'의 2개 이상 값을 구하면 된다.

 

⭐ 풀이과정

먼저 여느때와 마찬가지로 input값을 잘 정리해서 나눈다. 다만 이번에 두번째 값들은 이중배열로서 각 좌표값이 찍혀있는 형태가 필요하여 적절하게 map으로 새롭게 만들어내서 좌표값들을 잘 넣어주고, x와 y값들의 평행한 선들을 넣어줄 Map() 객체들을 각각 xMap, yMap으로 생성해두고 결과값을 리턴할 count 변수를 만들어둔다.

const fs = require("fs");
const input = fs
  .readFileSync("./example.txt")
  .toString()
  .split("\n")
  .map((line) => line.replace("\r", ""));
const points = input.slice(1).map((line) => {
  const [x, y] = line.split(" ").map(Number);
  return [x, y];
});

function solution(points) {
  const xMap = new Map();
  const yMap = new Map();
  let count = 0;
}
solution(points);

다음으로 이중배열로 만들어서 매개변수로 넘겨둔 points에 반복문을 돌면서 x값이 존재하지 않으면(!has()) x에는 해당 값을 채워넣고 첫번째로 들어온 값 1을 value로 넣어둔다.(set(x,1)) 그리고 반복문에 의해서 key값이 존재하면 key값에는 해당 요소의 값, value에는 현재 key - value에 저장되어 있는 값에 1씩 증가시키도록 한다.

 마찬가지로 y값에 대해서도 똑같은 작업을 수행하도록 한다.

function solution(points) {
  const xMap = new Map();
  const yMap = new Map();
  let count = 0;

  for (const [x, y] of points) {
    if (xMap.has(x)) xMap.set(x, xMap.get(x) + 1);
    else xMap.set(x, 1);

    if (yMap.has(y)) yMap.set(y, yMap.get(y) + 1);
    else yMap.set(y, 1);
  }
}
solution(points);

 

이렇게 만들었을경우 현재 문제의 input 조건기준으로 xMap, yMap에는 각각 Map(2) ( 0 => 2, 10 => 2) 값이 담기게 된다. 해당 Map() 객체의 value값 기준으로 한번 더 반복문 돌면서 value가 2 이상인 경우에 xMap, yMap 기준으로 모두 count를 1씩 증가시키게 되면 문제에서 제시한 조건대로 모든 평행한 선의 갯수를 출력하게 된다.

for (let value of xMap.values()) {
  if (value >= 2) count++;
}

for (let value of yMap.values()) {
  if (value >= 2) count++;
}

 

⭐ 제출답안

const fs = require("fs");
const input = fs
  .readFileSync("./example.txt")
  .toString()
  .split("\n")
  .map((line) => line.replace("\r", ""));
const points = input.slice(1).map((line) => {
  const [x, y] = line.split(" ").map(Number);
  return [x, y];
});

function solution(points) {
  const xMap = new Map();
  const yMap = new Map();
  let count = 0;

  for (const [x, y] of points) {
    if (xMap.has(x)) xMap.set(x, xMap.get(x) + 1);
    else xMap.set(x, 1);

    if (yMap.has(y)) yMap.set(y, yMap.get(y) + 1);
    else yMap.set(y, 1);
  }
  for (let value of xMap.values()) {
    if (value >= 2) count++;
  }
  for (let value of yMap.values()) {
    if (value >= 2) count++;
  }
  console.log(count);
}
solution(points);

 

⭐ 공부했던 개념들

  • Map() 객체의 key나 value에 재귀적으로 자신의 값을 바라보는 get() 메서드를 사용할 수 있다는 점을 알았다. 어찌보면 당연하지만....