본문 바로가기
활동/이노베이션 캠프

[TIL] 230523 - 백준 알고리즘 문제 풀이

by gardenii 2023. 5. 24.

오늘 한 것

- 백준 알고리즘 문제 풀이
4989번 : 베르트랑 공준
2869번 : 달팽이는 올라가고 싶다
10250번 : ACM 호텔
1929번 : 소수 구하기
1110번 : 더하기 사이클


백준 문제 풀이 

백준 4989번 : 베르트랑 공준 (난이도 하)

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

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : __dirname + '/input.txt';
var input = fs.readFileSync(filePath).toString().split('\n');
let num = [];
for (let i = 0; i < input.length; i++) {
    if(parseInt(input[i]) == 0)
        break;
    num.push(parseInt(input[i]));
}

let num_lit = new Array(Math.max.apply(null, num) * 2); // 최댓값의 2배만큼 수열 만들기
num_lit.fill(true); // 소수면 true 소수가 아니면 false
num_lit[0] = false; // 0 // 0 과 1은 소수가 아니니까 0과 1은 제외
num_lit[1] = false; // 1

for(let i = 2; i <= parseInt(Math.sqrt(num_lit.length)); i++) { // 2부터 소수인지 판별 하되
    if (!num_lit[i]) // 소수가 아닌 수로 판별 된 것은 ( 이미 제외시킨 수니까 ) 제외
        continue;
    for (let j = i + i; j < num_lit.length; j += i) { // 자기 자신을 제외한 다음 배수부터 ( i + i ) 배수만큼 ( += i ) 수열에서 소수 제외시키기
        num_lit[j] = false;
    }
}

num.forEach((n)=>{
    let count = 0;
    for (let i = n + 1; i <= 2 * n; i++) {
        if(num_lit[i])
            count++;
    }
    console.log(count);
})

드라이버로 처음 참여했던 문제... 다들 Java하셔서 js로 설명해주시느라 고생하셨어요
문제를 잘 푸는것도 중요하지만 시간도 문제라는 걸 알게 된 문항
알고리즘 시간 복잡도를 이론으로 배울 때는 솔직히 와닿지 않았었는데 이렇게 시간으로 결과가 나오니 왜 중요한지 알게되었다..
 

 백준 2869번 : 달팽이는 올라가고 싶다 (난이도 중하)

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

2869번: 달팽이는 올라가고 싶다

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

www.acmicpc.net

코드 추가 예정
 

 백준 10250번 : ACM 호텔 (난이도 중하)

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

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

코드 추가 예정
 

백준 1929번 : 소수 구하기 (난이도 중하)

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

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : __dirname + '/input.txt';
var input = fs.readFileSync(filePath).toString().split(' '); // 콘솔 입력
let num = [];
for (let i = 0; i < input.length; i++) {
    if(parseInt(input[i]) == 0)
        break;
    num.push(parseInt(input[i]));
     }

// 방법 1
let num_lit = new Array(num[1] + 1).fill().map((arr,i) =>{
     if(i % 2 == 0)
         return false;
     return true;
 });
 num_lit[1] = false; // 1
 num_lit[2] = true;
 for(let i = 3; i <= parseInt(Math.sqrt(num[1])); i++) { // 2부터 소수인지 판별 하되
     if (!num_lit[i]) // 소수가 아닌 수로 판별 된 것은 ( 이미 제외시킨 수니까 ) 제외
         continue;
     for (let j = i + i; j < num_lit.length; j += i) { // 자기 자신을 제외한 다음 배수부터 ( i + i ) 배수만큼 ( += i ) 수열에서 소수 제외시키기
         num_lit[j] = false;
     }
 }

// 방법 2 - 에라토스테네스의 체 이용
let num_lit = new Array(/*max 수열 + 1*/ num[1] + 1); // 최댓값의 2배만큼 수열 만들기
num_lit.fill(true); // 소수면 true 소수가 아니면 false
num_lit[0] = false; // 0 // 0 과 1은 소수가 아니니까 0과 1은 제외
num_lit[1] = false; // 1

for(let i = 2; i <= parseInt(Math.sqrt(num_lit.length)); i++) { // 2부터 소수인지 판별 하되
    if (!num_lit[i]) // 소수가 아닌 수로 판별 된 것은 ( 이미 제외시킨 수니까 ) 제외
        continue;
    for (let j = i + i; j < num_lit.length; j += i) { // 자기 자신을 제외한 다음 배수부터 ( i + i ) 배수만큼 ( += i ) 수열에서 소수 제외시키기
        num_lit[j] = false;
    }
}

for (let i = num[0]; i < num[1]; i++) {
    if(num_lit[i])
        console.log(i);
}

 

백준 1110번 : 더하기 사이클 (난이도 중하)

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

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : __dirname + '/input.txt';
var input = fs.readFileSync(filePath).toString().split(' '); // 콘솔 입력
let num = input[0];

let temp = 0;
temp = num;

let count = 0;

do{
    if(temp < 10){
        temp = temp * 10 + temp;
    } else {
        temp = (temp%10 * 10) + (parseInt(temp / 10) + temp % 10) % 10;
    }
    count++;
} while(temp != num)
    console.log(count);
}

팀원 Jun님이 네비게이터, 팀원들이 모두 드라이버가 되어 작성된 마법의 코드


일기

더보기

짝 프로그래밍으로 알고리즘을 풀도록 지도해주시는데, 처음에는 짝 프로그래밍을 어떻게 진행하는지 어려웠지만 Jun님이 잘 이끌어주신 덕분에 장점을 확실하게 알 수 있었다.