[백준]4단계

JH Cho·2022년 8월 2일
0

알고리즘

목록 보기
9/12

4-1(10818)

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs.readFileSync(filePath).toString().split("\n");
input = input[1].split(" ").map((item) => +item);
// console.log(input); [20, 10, 35, 30, 7];

let minValue = Math.min(...input); // ...arr   배열의 element들을 배열에서 꺼내어 리턴.
// console.log(minValue); 7;
let maxValue = Math.max(...input);
// console.log(maxValue); 35;

console.log(minValue + " " + maxValue);

알아보기 (배열을 꺼내 풀어주는 것에 대해서)

  • 전개연산자 ...arr
  • Function.prototype.apply()
apply(함수에서 사용할 this 객체, 호출하는 함수로 전달할 파라미터) - 파라미터는 배열 형태로 입력.
let maxValue = Math.max.apply(null, arr);
// apply(this, 배열)  this 지정할 필요 없으면 null.

console.log(maxValue); 

4-2(2562)


const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs.readFileSync(filePath).toString().split("\n");

// console.log(input); ["3", "29", "38", "12", "57", "74", "40", "85", "61"];
// 스트링으로 변환되어 배열이 된 입력값을 숫자로 변환한다.
// 최댓값을 구한다.
// indexOf로 최댓값을 대입해서 몇번째인지 표시한다.
// 여기서는 인덱스가 아닌 단순히 몇번째인지 알려는 것 그래서 + 1

input = input.map((item) => +item);
// console.log(input); [3, 29, 38, 12, 57, 74, 40, 85, 61];

let maxNumber = Math.max(...input);
//or let maxNumber = Math.max.apply(null, input);
// console.log(maxNumber); 85

let numOrder = input.indexOf(85) + 1;
// console.log(numOrder); 7

console.log(maxNumber + "\n" + numOrder);

-------틀렸다고 뜸.------


let maxNumber = Math.max(...input);


let numOrder = input.indexOf(maxNumber) + 1;


console.log(maxNumber + "\n" + numOrder);

indexOf에 85를 아닌 maxNumber를 넣으니 맞았다고 뜸.

--------반복문, 조건문 통해서 풀어보기------
let max = input[0];
let maxIndex = 0;

for (let i = 0; i < input.length; i++) {
  if (max < input[i]) {
    max = input[i];
    maxIndex = i;
  } 
}

console.log(max + "\n" + (maxIndex + 1));
/* max가 input[i] 보다 작으면 input[i]가
max로 되고 maxIndex값도 해당 i값 지정*/

4-3(2557)

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs
  .readFileSync(filePath)
  .toString()
  .split("\n")
  .map((item) => +item);

// console.log(input); [ 150, 266, 427 ]

// 배열 안의 숫자를 곱해준다
// 결과값에서 0~9 까지 숫자가 몇번씩 나오는지 구한다
// 숫자를 줄바꿈으로 표현한다.

let num = String(input[0] * input[1] * input[2]);
// console.log(num); //17037300;
// console.log(num[1]); // 그대로 Number로 쓰게 되면 undefined 뜸.

for (let i = 0; i <= 9; i++) {
  let count = 0;

  for (let j = 0; j < num.length; j++) {
    if (num[j] == i) {
      count++;
    }
  }
  console.log(count);
}

4-4(3052)


const { count } = require("console");
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs
  .readFileSync(filePath)
  .toString()
  .split("\n")
  .map((x) => +x);
// console.log(input);[39, 40, 41, 42, 43, 44, 82, 83, 84, 85];

// 나머지를 모두 구하여 배열화 하고 중복된 요소를 제거한 후 인덱스값 + 1로 ?

let newArr = [];
for (let i = 0; i < input.length; i++) {
  newArr.push(input[i] % 42);
}
//console.log(newArr);[39, 40, 41, 0, 1, 2, 40, 41, 0, 1];

let result = newArr.filter((element, index) => {
  return newArr.indexOf(element) === index;
});

//console.log(result); [39, 40, 41, 0, 1, 2];

console.log(result.length);
--------입력값 모두 결과는 제대로 나옴-----근데 틀림

const userNum = [];

input.forEach(x => {
     const num = x % 42;
    
    if (userNum.indexOf(num) === -1) {
        userNum.push(num);
    }
});

console.log(userNum.length);

------------다른풀이----------
  const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
	
const count = new Set(input.map(x => x % 42)).size;
    
console.log(count);

나의 생각 : forEach, set, map 메서드 등을 학습하고 다시 풀어보자.

4-5(1546)

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs.readFileSync(filePath).toString().split("\n");
//console.log(input); ["3", "40 80 60"];
/*
1. 과목 개수(N) = input[0]
2. 점수 배열 새로 짜기 -> let newArr = input[1].split(' ')
3. 최대 값 = Math.max(newArr);
4. 평균 구하기 : newArr의 요소를 요소 / 최대값 * 100 으로 계산 후 모두 더하고 N으로 나눈다.
*/

let N = +input[0];
// console.log(N);

let score = input[1].split(" ").map((x) => +x);
// console.log(score); [40, 80, 60];
let max = Math.max.apply(null, score);
//console.log(max); 80

let result = [];

for (let i = 0; i < score.length; i++) {
  newScore = (score[i] / max) * 100;
  result.push(newScore);
}
// console.log(result);
// [
//   11.11111111111111, 22.22222222222222, 33.33333333333333, 44.44444444444444,
//   55.55555555555556, 66.66666666666666, 77.77777777777779, 88.88888888888889,
//   100,
// ];
let sum = 0;
result.forEach((value) => (sum += value));
console.log(sum);
let realResult = sum / N;
console.log(realResult);

-----------맞았지만 아쉽다----이렇게 짧은 코드와 같다----
const num = input[0] * 1; // 점수 개수
const score = input[1].split(" "); //점수들 배열로 만듦

const max = Math.max(...score); //최댓값
let sum = 0; 

for (let i = 0; i < num; i++) {
  sum += (score[i] / max) * 100;
}  //내가 만든 코드가 결국 이렇게 짧은 코드..

console.log(sum / num);

4-6(8958)

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs.readFileSync(filePath).toString().split("\n");

let arrayLength = +input[0]; // 5
let items = input.slice(1); // slice(star, end) 1번 요소부터 끝까지만 잘라서 새 배열을 만듦.

for (let i = 0; i < arrayLength; i++) {
  let oxList = items[i];
  let oCount = 0;
  let score = 0;
  for (let j = 0; j < oxList.length; j++) {
    let oxQuiz = oxList[j]; // OOXXOXXOOO 0번 인덱스부터 차례대로  / 1번 인덱스도 O니까
    if (oxQuiz === "O") {
      //  해당 인덱스의 요소가 O와 같다면    / 조건을 만족하고
      oCount++; // oCount를 1 올려주고                  / oCount(1)의 값을 2로 만들어주고
      score += oCount; // scores는 1이 된다.                   / 1의 값을 가진 score에 2가 된 oCount가 더해져서 score가 3이 된다.
    } else {
      // 다음 2번인덱스 차례에서는 위 조건을 만족하지 않으니
      oCount = 0; //oCount의 값은 다시 0으로 초기화 된다.
    }
  }
  console.log(score);
}

4-7(4344)

  • 처음에는 해결 코드를 한번 만들어서 작성해봤다.
    첫번째 반의 입력값을 대상으로 했고
    결과값은 잘 나온다.

// console.log(input); // 입력값을 줄 별로 나눠 배열로 만들었다.
input = input[1].split(" ").map((x) => +x);
// console.log(input); // [5, 50, 50, 70, 80, 100]; // 첫번째 케이스를 기준을 코딩하기 위해서 따로 뻄.
//반 인원 수 :  input[0] 
let total = 0;
for (let i = 1; i < input.length; i++) {
  total += input[i];
}
// console.log(total); //350  얘를 input[0]으로 나눠

let avg = total / input[0];
// console.log(avg); //70

let avgUp = 0;
for (j = 1; j < input.length; j++) {
  if (input[j] > avg) {
    avgUp++;
  }
}
let result = (avgUp / input[0]) * 100;
// console.log(result); //40
console.log(result.toFixed(3), "%"); //40.000 %
  • 풀이

const fs = require("fs");
const { fileURLToPath } = require("url");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

let input = fs.readFileSync(filePath).toString().split("\n");

let allCases = input[0]; // 총 반의 개수

for (let i = 1; i <= allCases; i++) {
  // i= 1 가정
  let cases = input[i].split(" "); // 1번 case 요소들 배열 새로 만듦.
  let studentsNum = Number(cases[0]); // 1번 인덱스 인풋 학생 수
  let sum = 0;
  for (let j = 1; j <= studentsNum; j++) {
    //1번 점수 총 합.
    sum += Number(cases[j]);
  }
  let avg = sum / studentsNum;

  let upperScore = 0;
  for (let k = 1; k <= studentsNum; k++) {
    if (avg < cases[k]) {
      upperScore++;
    }
  }
  result = ((upperScore / studentsNum) * 100).toFixed(3);
  console.log(result + "%");
}
profile
주먹구구식은 버리고 Why & How를 고민하며 프로그래밍 하는 개발자가 되자!

0개의 댓글