728x90

문제


https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

코드


  • 처음 시도한 풀이 (시간 초과)
    //실버5 좌표 정렬하기
    const fs = require("fs");
    const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
    let input = fs.readFileSync(filePath).toString().trim().split("\r\n");
    
    let N = Number(input.shift());
    let coordinate = [];
    
    for (let i = 0; i < N; i++) {
      coordinate.push(input[i].split(" ").map((i) => Number(i)));
    }
    
    coordinate = coordinate.sort((a, b) => {
      if (a[0] > b[0]) return 1;
      else if (a[0] < b[0]) return -1;
      else {
        if (a[1] > b[1]) return 1;
        else return -1;
      }
    });
    for (let i = 0; i < N; i++) console.log(coordinate[i].join(" "));​
  • 다시 시도한 풀이 (성공)
    //실버5 좌표 정렬하기
    const fs = require("fs");
    const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
    let input = fs.readFileSync(filePath).toString().trim().split("\r\n");
    
    let N = Number(input.shift());
    let coordinate = input.map((i) => i.split(" ").map((j) => Number(j))); //좌표를 number화 하여 배열에 담기
    let answer = "";
    
    coordinate.sort((a, b) => {
      //각 좌표들을 비교하며 x가 같지않으면 x에 대해 오름차순 정렬하고
      if (a[0] !== b[0]) return a[0] - b[0];
      //그게 아니면 y에 대해 오름차순 정렬하기
      return a[1] - b[1];
    });
    coordinate.forEach((i) => {
      //정렬된 좌표들 각각에 대해 answer에 담기
      answer += `${i[0]} ${i[1]}\n`;
    });
    
    console.log(answer);​

후기


  • 쉽게 풀어서 성공! 이라고 생각했는데 시간초과에서 자꾸 막혔던 문제이다. 다른 분의 풀이를 참고해서 sort()를 적용하는 신박한 방법과 console.log()를 1번만 찍는 걸로 코드를 수정했다.
  • 다른 분의 풀이를 참고하여 변경한 sort()코드는 가시적으로도 한눈에 더 이해하기 쉬웠고, 여러 if문을 쓰지 않아 더 효율적인 것 같다. 또한 console.log()를 for문으로 반복적으로 찍는 것보다 문자열로 처리하여 한 번에 출력하는 방법이 있단 것도 배우게 됐다! 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀

+ Recent posts