728x90

문제


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

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어

www.acmicpc.net

 

코드


//실버3 시리얼 번호
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//문자열 속 숫자들을 더해주는 함수
function sum(str) {
  let result = 0;
  str = str.replace(/[^0-9]/g, ""); //문자열에서 숫자를 제외한 문자는 없애기
  str = str.split("").map((i) => parseInt(i)); //숫자도 문자로 돼있으니 number형으로 변환
  for (let i of str) result += i; //각 숫자들을 더하기
  return result;
}

input.shift(); //기타의 개수 N
input = input.sort((a, b) => {
  if (a.length > b.length) return 1;
  //길이 순대로 정렬(오름차순)
  else if (a.length < b.length) return -1;
  else {
    if (sum(a) > sum(b)) return 1;
    //숫자의 합에 따른 정렬(오름차순)
    else if (sum(a) < sum(b)) return -1;
    else {
      if (a > b) return 1;
      //사전순으로 정렬
      else return -1;
    }
  }
});
console.log(input.join("\n"));

 

후기


  • 문자와 숫자가 혼합된 문자열에서 문자만 빼거나, 숫자만 빼기 위해서는 정규식을 이용하면 쉽게 뺄 수 있다!
728x90

문제


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

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

코드


//실버4 국영수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

let answer = []; //정답이 될 이름들을 담을 배열
let N = parseInt(input.shift()); //학생 수

input = input
  .map((i) => i.split(" ").map((j) => Number(j) || j)) //input의 각 요소에 대해 공백기준으로 나누어서 배열화하고, number형으로 변환가능한 건 변환하고 아니면 string 그대로 변환
  .sort((a, b) => {
    if (a[1] < b[1]) return 1;
    //국어점수 비교(내림차순)
    else if (a[1] > b[1]) return -1;
    else {
      if (a[2] > b[2]) return 1;
      //영어점수 비교(오름차순)
      else if (a[2] < b[2]) return -1;
      else {
        if (a[3] < b[3]) return 1;
        //수학점수 비교(내림차순)
        else if (a[3] > b[3]) return -1;
        else {
          if (a[0] > b[0]) return 1;
          //이름 비교(오름차순)
          else if (a[0] < b[0]) return -1;
          else return 0;
        }
      }
    }
  });
input.forEach((i) => answer.push(i[0])); //조건대로 정렬된 input의 이름만 push
console.log(answer.join("\n")); //한줄단위로 이름 출력

 

후기


  • 정렬문제 자체는 어렵지 않았으나 맨 처음 input의 '학생이름 국어점수 영어점수 수학점수'를 학생이름만 string으로 받고, 나머지는 number 형으로 받는 방법에서 막혔는데, 다른 분의 풀이를 참고하여 해결하였다
  • map을 이중으로 쓰며 "|| 연산자"의 특성을 활용하여 Number형으로 변환 가능한 것은 number로 바꿔주고 아닌것은 원래 string그대로 받을 수 있는 방법이 신박했다
728x90

문제


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

 

11004번: K번째 수

수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

코드


//실버5 K번째 수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//str->num 타입 변환
function strToNum(str) {
  return str.split(" ").map((i) => parseInt(i));
}

const K = strToNum(input.shift())[1] - 1; //K번째 수 뽑고 index를 맞추기 위해 -1
let A = strToNum(input.shift()).sort((a, b) => a - b); //숫자 배열 오름차순
console.log(A[K]);
728x90

문제


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

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

코드


//브론즈2 알파벳 개수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//각 문자열과 a의 아스키코드 차이 수를 return하는 함수
function getASCIInum(str) {
  return str.charCodeAt() - "a".charCodeAt();
}

const str = input.shift();
let alphabet = new Array(26).fill(0); //a-z 까지 담을 배열 생성

for (let i = 0; i < str.length; i++) {
  let index = getASCIInum(str[i]); //각 문자열과 a의 아스키 코드 차이를 통해 인덱스를 얻음
  alphabet[index]++; //해당 인덱스에 +1
}

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

+ Recent posts