📍코드포스 첫 도전 후기
처음으로 도전해본 코드포스 라운드 Div.3
기업 코딩테스트와 형식이 비슷했고 7문제 중에 a,b,c 3문제를 풀었다
내가 푼 문제들은 백준 기준으로 브론즈~실버 정도 난이도였던 것 같다
문제가 영어로 되어 있어서 문제를 해석하는데 애를 먹었다
📍테스트 정보
✅라운드 이름 : Codeforces Round #847 (Div. 3)
✅대회 시간 : 230107 23:35 ~ 230128 01:50 (2시간 30분 정도)
✅7문제
📍문제 A. Polycarp and the Day of Pi
https://codeforces.com/contest/1790/problem/A
파이를 나열한 수를 input으로 주고 얼마나 일치하는지 출력하는 문제
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
input.shift();
const PI = "314159265358979323846264338327";
const answer = [];
for (let str of input) {
let sameCount = 0;
for (let i = 0; i < str.length; i++) {
if (str[i] === PI[i]) sameCount++;
else break;
}
answer.push(sameCount);
}
console.log(answer.join("\n"));
});
📍문제 B. Taisia and Dice
https://codeforces.com/contest/1790/problem/B
전형적인 greedy 문제로, 조건을 만족하는 조합을 찾는 문제
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
/*
n : 주사위 갯수
s : 최댓값 포함 토탈 (n 개 합)
r : 최댓값 제외한 토탈 (n-1 개 합)
2 2 1
1 1
2 4 2
2 2
4 9 5
최댓값 = 9 - 5 = 4 max = s - r
잔여 것들의 합 = 5 (3개로 이루어짐) 4보다 작은
1.
answer = [0] * n - 1
2.
let idx = 0
while sum(answer) < 5
if (idx === n - 1) idx = 0
answer[idx]++
idx++
3. 구해진 answer 에 s - r push
*/
const input = [];
const output = [];
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
const N = +input.shift();
const data = input.map((el) => el.split(" ").map(Number));
for (let row of data) {
const [n, s, r] = row; // 4 9 5
const result = Array.from({ length: n - 1 }, (_) => 0);
let idx = 0;
let sum = 0;
while (sum < r) {
if (idx === n - 1) idx = 0;
result[idx]++;
idx++;
sum = result.reduce((acc, cur) => acc + cur, 0);
}
result.push(s - r);
output.push(result.join(" "));
}
console.log(output.join("\n"));
});
📍문제 C. Premutation
https://codeforces.com/problemset/problem/1790/C
연속된 수열에서 한 자리씩을 빼고 주어지는데, 이것을 바탕으로 온전한 수열을 출력하는 문제
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
const output = [];
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
const N = +input.shift();
for (let i = 0; i < N; i++) {
const n = +input.shift();
const idxCounter = {};
for (let j = 1; j <= n; j++) {
idxCounter[j] = 0;
}
const data = input.splice(0, n);
for (let row of data) {
const arr = row.split(" ").map(Number);
for (let k = 0; k < n - 1; k++) {
idxCounter[arr[k]] += k;
}
}
const answer = Object.keys(idxCounter).sort(
(a, b) => idxCounter[a] - idxCounter[b],
);
output.push(answer.join(" "));
}
console.log(output.join("\n"));
});
📍문제 D. Matryoshkas (시간초과)
https://codeforces.com/contest/1790/problem/D
주어진 수열이 1씩 증가하는 형태로 몇 세트가 만들어질 수 있는지 출력하는 문제
시간 초과를 해결하지 못했다..
// 시간초과
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
const output = [];
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
const N = +input.shift();
for (let i = 0; i < 2 * N; i += 2) {
const [a, b] = [input[i], input[i + 1]];
const n = +a;
const arr = b
.split(" ")
.map(Number)
.sort((a, b) => b - a);
const answer = [];
let newSet = true;
while (arr.length) {
const current = arr.pop();
for (let j = 0; j < answer.length; j++) {
if (answer[j] + 1 === current) {
answer[j] = current;
newSet = false;
break;
}
}
if (newSet) answer.push(current);
newSet = true;
}
output.push(answer.length);
}
console.log(output.join("\n"));
});