[배열] 백준 - 요세푸스(1158), 방번호(1475), 개수세기(10807), 알파벳 개수(10808), 방배정(13300)

iberis2·2023년 6월 21일
0
post-thumbnail

선택 언어 : nodejs
백준 배열 문제 모음 : 🔗 BaaaaaaaaaaarkingDog 0x03강 - 배열

1158번 - 요세푸스 문제

풀이1. Queue

  1. 1 부터 N 까지 순서대로 담긴 Queue를 만들고
  2. count가 K 번째가 될 때마다, 즉 count % K === 0 일 때 answer에 담고
  3. K번째가 아니면 Queue의 맨 뒤로 보내서 Queue에서 모두 꺼내질 때 까지 반복
let [N, K] = require('fs').readFileSync('./input.txt').toString().trim().split(' ').map(Number)
let que = [...Array(N)].map((_, idx) => idx + 1) // [1, 2, 3, 4, 5, 6, 7]
let answer = [],
  count = 1

while (que.length > 0) {
  const shiftItem = que.shift()
  if (count % K === 0) {
    answer.push(shiftItem)
  } else {
    que.push(shiftItem)
  }
  count++
}

console.log(`<${answer.join(', ')}>`)

풀이2. splice

const [N, K] = require('fs').readFileSync('./input.txt').toString().trim().split(' ').map(Number)

let arr = [...Array(N)].map((_, idx) => idx + 1) // [1, 2, 3, 4, 5, 6, 7]
let pick = 0
let answer = []

while (arr.length) {
  pick = (pick + K - 1) % arr.length // ① 인덱스 번호니까 K -1 번째 ②꺼낼 번째 수가 arr.length를 넘어가지 않도록
  answer.push(arr.splice(pick, 1))
}

console.log('<' + answer.join(', ') + '>')

1475번 - 방 번호

  1. 입력된 숫자들 중 가장 많이 나온 숫자의 개수만큼 카드 세트가 필요하다
  2. 0 부터 9 를 인덱스로 가지고, 각 숫자의 개수가 element인 배열을 만든다.
  3. 입력된 숫자를 순서대로 순회하, 배열의 해당 숫자 인덱스의 element를 1씩 증가시킨다
  4. 가장 큰 element(가장 많이 나온 숫자의 개수)만큼 숫자세트는 필요하다
  5. 6 또는 9가 나오면 둘 중 적게 나온 숫자에 1을 더해준다.
const input = require('fs').readFileSync('./input.txt').toString().trim()

let count = Array(10).fill(0) // 인덱스 번호 === 카드 번호

for (let i = 0; i < input.length; i++) {
  if (input[i] === '9' || input[i] === '6') {
    count[9] >= count[6] ? count[6]++ : count[9]++
  } else {
    count[+input[i]]++
  }
}

console.log(Math.max(...count))

10807번 - 개수 세기

// '/dev/stdin'
let [counts, input, num] = require('fs').readFileSync('./input.txt').toString().trim().split('\n')
counts = Number(counts)
input = input.split(' ').map(Number)
num = Number(num)
// counts: 11
// input: [ 1, 4, 1, 2, 4, 2, 4, 2, 3, 4, 4 ]
// num 2

function solution(input, num) {
  const answer = input.filter(ele => ele === num)
  console.log(answer.length)
}

solution(input, num)

10808번 - 알파벳 개수

  1. 알파벳을 키로 하고 값이 0인 객체를 아스키코드를 이용해 만든다
  2. 입력 받은 문자열을 배열로 만들어 순회하며 각 요소가 키인 알파벳 객체의 값에 1씩 더한다
  3. 알파벳 객체의 값을 배열로 만들어 spread 문법으로 출력한다.
const input = require('fs').readFileSync('./input.txt').toString().trim().split('')

const alphabet = {}
for (let i = 97; i < 123; i++) {
  alphabet[String.fromCharCode(i)] = 0
}

input.forEach(el => alphabet[el]++)
console.log(...Object.values(alphabet))

13300번 - 방 배정

  1. 학년별로 [여자, 남자]의 각 학생수를 알수 있는 객체를 만들고
  2. 학년, 성별 별로 최대 방의 수로 나눈 값을 올림하여 합친다.
const [[N, capacity], ...input] = require('fs')
  .readFileSync('./input.txt')
  .toString()
  .trim()
  .split('\n')
  .map(el => el.split(' ').map(Number))

const students = {}
for (let i = 1; i <= 6; i++) {
  students[i] = [0, 0]
}

for ([gender, grade] of input) {
  gender ? students[grade][1]++ : students[grade][0]++
}
/* students: {
  '1': [ 1, 2 ],
  '2': [ 2, 1 ],
  '3': [ 1, 3 ],
  '4': [ 0, 1 ],
  '5': [ 1, 2 ],
  '6': [ 1, 1 ]
} */

let flatAry = Object.values(students).flat() // [ 1, 2, 2, 1, 1, 3, 0, 1, 1, 2, 1, 1 ]
let answer = flatAry.reduce((acc, cur) => {
  return (acc += cur ? Math.ceil(cur / capacity) : 0)
}, 0)
console.log(answer)
profile
React, Next.js, TypeScript 로 개발 중인 프론트엔드 개발자

0개의 댓글