스떠디_5week (JavaScript_ 완전탐색)

mingyu Lim·2023년 7월 15일

코딩테스트

목록 보기
27/32

시리얼 번호_1431

문제 설명

문제 링크

  • 알파벳 대문자와 숫자로 이루어진 기타의 코드로 이루어진 문자열들을 정렬하시오. (각 문자열은 중복되지 않음)
  • 규칙)
    • A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
    • 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
    • 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.
  • Input
    • 첫 줄 기타의 개수 N이 주어진다. (N <= 50)
    • 둘째 줄부터 N개의 줄에 시리얼 번호 하나씩 주어져 있다.
    • 알파벳 대문자와 숫자로만 이루어져 있고, 중복되지 않는다.
5
ABCD
145C
A
A910
Z321
  • Output
A
ABCD
Z321
145C
A910

풀이와 설명

  1. sort메소드를 이용하여 A,B의 길이 중 짧은 순으로 정렬한다.
  2. 길이가 같을 경우, 숫자들을 Number타입으로 변경 후 reduce메소드를 사용하여 합치고 비교한다.
  3. 단, Number타입으로 변경하지 못하는 문자열은 NaN으로 return되기 때문에 NaN일 경우 0으로 리턴해준다.
  4. 합친 값이 같은 경우 A,B의 맨 앞부터 charCodeAt(0)메소드로 아스키 코드를 비교하고, 각 자리의 값이 다르면 비교하여 return한다.
const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n");
input.shift();

let arr = input.sort((a, b) => {
  if (a.length === b.length) { //2 
    let A = a
      .split("")
      .map((item) => {
        return !isNaN(Number(item)) ? Number(item) : 0; // 3
      })
      .reduce((a, b) => a + b);

    let B = b
      .split("")
      .map((item) => {
        return !isNaN(Number(item)) ? Number(item) : 0;
      })
      .reduce((a, b) => a + b);

    if (A === B) { // 4
      for (let i = 0; i < a.length; i++) {
        if (a[i] !== b[i]) return a.charCodeAt(i) - b.charCodeAt(i);
      }
    } else {
      return A - B;
    }
  } else { // 1
    return a.length - b.length;
  }
});
console.log(arr.join("\n").trim());

접미사 배열_11656

문제 설명

문제 링크

문제

  1. 알파벳 소문자로 이루어진 단어를 사전순으로 자신부터 잘라서 출력하시오.
  2. 만일 같은 알파벳이 있는 경우, 자신의 다음 부터 사전 순으로 출력
  • Input:
    첫 줄: 소문자로 이루어진 문자열 S (S <= 1000)
baekjoon
  • Output:
aekjoon
baekjoon
ekjoon
joon
kjoon
n
on
oon

문제 풀이

  1. 각 index별로 일단 자르고, sort메소드를 통해 정렬한다. sort메소드는 따로 compare함수를 작성해주지 않을 때, 아스키코드 기준으로 오름차순 정렬을 해준다.
const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split("");
let ans = [];
ans = input
  .map((_, idx) => {
    return input.slice(idx).join("");
  })
  .sort();

console.log(ans.join("\n"));

수 정렬하기 4_11931

문제 설명

문제 링크

문제

  1. N개의 수를 내림차순으로 정렬하시오.
  • Input:
    첫 줄: N (1 <= N <= 1,000,000)
    나머지: N개의 숫자
5
1
2
3
4
5
  • Output:
5
4
3
2
1

문제 풀이

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n");
input.shift();

console.log(input.sort((a, b) => Number(b) - Number(a)).join("\n"));

나이순 정렬_10814

문제 설명

문제 링크

문제

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

  • Input:
    • 첫 줄: 회원의 수 N (1 <= N <= 100,000)
    • 나머지
      나이와 이름을 공백으로 주어지고
      나이는 1<= 나이 <=200,
      이름은 이름 <= 100, 알파벳 대소문자로 이루어져있다.
3
21 Junkyu
21 Dohyun
20 Sunyoung
  • Output:
20 Sunyoung
21 Junkyu
21 Dohyun

문제 풀이

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n");
input.shift();
let arr = input.map((item) => {
  item = item.split(" ");
  return [Number(item[0]), item[1]];
});

console.log(
  arr
    .sort((a, b) => a[0] - b[0])
    .join("\n")
    .replaceAll(",", " ")
    .trim()
);

좌표 정렬하기 2_11651

문제 설명

문제 링크

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

  • Input:
    • 첫 줄: 점의 개수 N (1 <= N <= 100,000)
    • 나머지: (x,y)의 좌표 (-100,00 <= x,y <= 100,000)
5
0 4
1 2
1 -1
2 2
3 3
  • Output:
1 -1
1 2
2 2
3 3
0 4

문제 풀이

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n");
const leng = Number(input.shift());
let arr = input.map((item) => {
  let arr = item.split(" ");
  return [Number(arr[0]), Number(arr[1])];
});

console.log(
  arr
    .sort((a, b) => {
      // 같았을 때, x 다른 때, y를 비교
      return a[1] === b[1] ? a[0] - b[0] : a[1] - b[1];
    })
    .join("\n")
    .replaceAll(",", " ")
    .trim()
);

위상 정렬 개념 정리

위상 정렬 링크

줄 세우기_2252 (위상 정렬)

문제 설명

문제 링크

문제

N명의 학생들을 키 순서대로 줄을 세우기 위해, 일부 학생들의 키를 비교한 결과를 주어졌을 때 줄을 세우는 프로그램을 작성하시오.

  • Input:
    • 첫 줄: 학생 수 N (1 <= N <= 32,000), 비교한 수 M (1 <= N <= 100,000)
    • 나머지: A와 B 번호를 가진 학생이고, A가 B보다 앞에 서야 한다.
3 2
1 3
2 3
  • Output:
1 2 3

문제 풀이

const fs = require("fs");
const input = fs
  .readFileSync("dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((item) => item.split(" "));
const shift = input.shift().map(Number);
let indegree = Array.from({ length: shift[0] }, () => []);
let countArr = Array(Number(shift[0])).fill(0);
let ans = [];

function answersort() {
  let quene = [];
  countArr.map((item, idx) => {
    return item === 0 ? quene.push(idx + 1) : null;
  });
  while (quene.length) {
    let zero = quene.shift();
    indegree[zero - 1].forEach((item) => {
      countArr[item - 1]--;
      countArr[item - 1] === 0 ? quene.push(item) : null;
    });
    ans.push(zero);
  }
}

for (let i = 0; i < input.length; i++) {
  indegree[Number(input[i][0]) - 1].push(Number(input[i][1]));
  countArr[Number(input[i][1]) - 1]++;
}

answersort();

console.log(ans.join(" "));

);

음악프로그램_2623 (위상 정렬)

문제 설명

문제 링크

문제

보조 PD 세 명에게 각자 담당한 가수의 출연 순서를 모두 받아, 세 보조 PD가 정해온 순서를 만족할 수 있는 순서를 정하시오.

  • Input:
    • 첫 줄: 가수의 수 N (1 <= N <= 1000), 보조PD 수 M (1 <= N <= 100)
    • 나머지: 맨 앞은 보조PD가 담당하는 가수의 수, 나머지는 가수들의 순서
    • 주의: 첫 줄이 0일 경우도 생각해야된다. 문제가 이상한거 같다...
3 2
1 3
2 3
  • Output:
    • 순서를 정하지 못할 경우 0을 출력한다.
1 2 3

문제 풀이

const fs = require("fs");
const input = fs
  .readFileSync("./dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((item) => item.split(" "));
const shift = input.shift().map(Number);
if (shift[1] === 0 || shift[0] === 0) return console.log(0);
let indegree = Array.from({ length: shift[0] }, () => []);
let countArr = Array(shift[0]).fill(0);
let ans = [];

function answersort() {
  let quene = [];
  countArr.map((item, idx) => {
    return item === 0 ? quene.push(idx + 1) : null;
  });
  while (quene.length) {
    let zero = quene.shift();
    indegree[zero - 1].forEach((item) => {
      countArr[item - 1]--;
      countArr[item - 1] === 0 ? quene.push(item) : null;
    });
    ans.push(zero);
  }
}

for (let i = 0; i < input.length; i++) {
  input[i].shift();
  for (let j = 0; j < input[i].length - 1; j++) {
    indegree[Number(input[i][j]) - 1].push(Number(input[i][j + 1]));
    countArr[Number(input[i][j + 1]) - 1]++;
  }
}

answersort();
if (Math.max(...countArr) === 0) console.log(ans.join(" "));
else console.log(0);

0개의 댓글