bronze

백준 PS 난이도 브론즈 문제 모음

[백준 문제풀이] 10798번 세로읽기


10798번 세로읽기 (Bronze 1)

문제

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

아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.

이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.

A A B C D D a f z z 0 9 1 2 1 a 8 E W g 6 P 5 h 3 k x

한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.

심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.

그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.

입력

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.

출력

영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const fs = require("fs");
const words = fs
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((el) => el.split(""));

let answer = "";

for (let j = 0; j < 15; j++) {
  for (let i = 0; i < words.length; i++) {
    if (words[i][j]) answer += words[i][j];
  }
}

console.log(answer);

[백준 문제풀이] 2609번 최대공약수와 최소공배수


2609번 최대공약수와 최소공배수 (Bronze 1)

문제

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

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

풀이

오늘은 알고리즘 문제에 집중이 되지 않아서, 자꾸 에러가 나고 코드가 예쁘지가 않아 최소공배수와 최대공약수의 개념을 찾아보았다.

최소공배수를 구하는 방법으로 신기한 것을 알 수 있었는데 gcd : 최대공약수, lcm : 최소공배수 a _ b = gcd _ lcm이라는 식을 통해서 lcm = (a*b) / gcd를 통해 구할 수 있다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
input = input.map((el) => parseInt(el));

let a = input[0];
let b = input[1];

if (a < b) {
  let a = input[1];
  let b = input[0];
}

let gcd = 1;

for (let i = 2; i <= b; i++) {
  if (a % i === 0 && b % i === 0) {
    gcd = i;
  }
}

const lcm = (a * b) / gcd;

console.log(gcd);
console.log(lcm);

[백준 문제풀이] 9093번 단어 뒤집기


9093번 단어 뒤집기 (Bronze 1)

문제

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

문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.

출력

각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.

split + reverse 메서드 풀이

split으로 각 단어를 나눈 배열을 만든 뒤 각각 단어를 뒤집은 배열을 추가해서 공백을 join해서 풀이하면 될 것 같다. 문제는 시간이 가능한가인데, 일단 해보고 다른 섹시한 풀이를 찾아보기로 했다.

소스코드 (split + reverse 메서드 사용, 288ms)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const T = input.shift();
const answerArr = [];

for (let i = 0; i < T; i++) {
  const line = input[i].split(" ");
  let reversedLine = [];
  let reversedWord = "";
  for (let l = 0; l < line.length; l++) {
    const reversedWord = line[l].split("").reverse().join("");
    reversedLine.push(reversedWord);
  }
  answerArr.push(reversedLine.join(" "));
}

console.log(answerArr.join(" \n"));

스택을 사용한 풀이

stack 자료 구조의 특징을 활용해서 푸는 경우도 있었다. 문장을 split 하지 않고 stack에 문자를 하나씩 추가하고, 다 추가된 경우 다시 pop을 사용해서 재배열 하는 방식이었다. (524ms)

스택 풀이 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const T = parseInt(input.shift());
const answerArr = [];

for (let i = 0; i < T; i++) {
  let line = input[i];
  let str = "";
  const stack = [];

  for (let j = 0; j <= line.length; j++) {
    if (line[j] === " " || line[j] === undefined) {
      while (stack.length > 0) {
        str += stack.pop();
      }
      str += " ";
    } else {
      stack.push(line[j]);
    }
  }
  answerArr.push(str);
}

console.log(answerArr.join("\n"));

[백준 문제풀이] 2750번 수 정렬하기


2750번 수 정렬하기 (Bronze 1)

문제

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

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

첫번째 풀이

시간 복잡도가 O(n^2)인 풀이라고 해서, sort 메서드를 이용해서 쉽게 풀었다.

첫번째 풀이 소스코드

1
2
3
4
5
6
7
8
9
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
input = input.map((el) => parseInt(el));

const N = input.shift();

const answerArr = input.sort((a, b) => a - b);

console.log(answerArr.join("\n"));

두번째 풀이

2751번을 풀다가 해당 문제에서는 메서드를 사용하는 것이 아니었다는걸 알고, 다시 버블 정렬로 풀었다.

두번째 풀이 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
input = input.map((el) => parseInt(el));

const N = input.shift();

for (let i = 0; i < input.length; i++) {
  let swap;
  for (let j = 0; j < input.length - 1 - i; j++) {
    if (input[j] > input[j + 1]) {
      swap = input[j + 1];
      input[j + 1] = input[j];
      input[j] = swap;
    }
  }
  if (!swap) {
    break;
  }
}

console.log(input.join("\n"));

[백준 문제풀이] 2798번 블랙잭


2798번 블랙잭 (Bronze 2)

문제

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

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

배운 것

조합을 위한 알고리즘은 재귀를 사용해서 만든다.

forEach의 parameter는 element, index, array가 있다. element는 각각의 원소이고, index는 해당 원소의 위치, array는 forEach가 진행되는 배열을 말한다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

input[0] = input[0].split(" ");
const N = parseInt(input[0][0]);
const M = parseInt(input[0][1]);
const cards = input[1].split(" ").map((card) => parseInt(card));
let answer = 0;

const getCombinations = (arr, selectNumber) => {
  const results = [];
  if (selectNumber === 1) {
    return arr.map((element) => [element]);
  }

  arr.forEach((fixed, index, origin) => {
    const rest = origin.slice(index + 1);
    const combinations = getCombinations(rest, selectNumber - 1);
    const attached = combinations.map((element) => [fixed, ...element]);
    results.push(...attached);
  });
  return results;
};

getCombinations(cards, 3).forEach((result) => {
  const sum = result[0] + result[1] + result[2];
  if (sum <= M && answer <= sum) {
    answer = sum;
  }
});

console.log(answer);

[백준 문제풀이] 10870번 피보나치 수 5


10870번 피보나치 수 5 (Bronze 2)

문제

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

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 20보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

풀이

꼬리 재귀로 풀이했다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const fs = require("fs");
const input = parseInt(fs.readFileSync("/dev/stdin").toString().trim());

function fibonacci(n, number = 0, total = 1) {
  if (n === 0) {
    return 0;
  } else if (n === 1) {
    return total;
  } else {
    return fibonacci(n - 1, total, number + total);
  }
}

const answer = fibonacci(input);

console.log(answer);

[백준 문제풀이] 10872번 팩토리얼


10872번 팩토리얼 (Bronze 3)

문제

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

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(0 ≤ N ≤ 12)이 주어진다.

출력

첫째 줄에 N!을 출력한다.


재귀함수란?

재귀함수란 함수에서 스스로를 호출해서 명령을 수행하는 함수이다. 반복문을 사용하는 명령은 모두 재귀 함수를 통해 구현이 가능하고, 재귀함수를 반복문으로 만드는 것도 가능하다.

재귀함수를 만들 때는, 재귀 호출을 그만둘 수 있는 조건을 만들어야 무한 루프를 막을 수 있다.

재귀 함수는 단순히 명령을 반복하는 것이 아니라, 함수를 반복해서 호출하므로 메모리를 많이 차지하기 때문에 반복문에 비해 느리다.

그럼에도 재귀함수를 사용하는 이유는 변수를 만들 필요가 없으며, 반복문을 사용하지 않기 때문에 코드가 매우 간결해지기 때문이다.

다만 위에서 말한대로 단순한 반복문이 아니라 반복적으로 함수를 호출하기 때문에, 해당 함수에서 필요한 것들을 메모리에 저장하는 과정에서 스택 메모리가 커지고, stack overflow가 발생할 수 있다.

이러한 에러를 방지하기 위해 사용하는 방법이 ‘꼬리 재귀 최적화’ 이다.

꼬리 재귀는 재귀 함수의 호출 이후 바로 결과만 반환할 수 있도록 하는 방법이다. 이러한 것은 코드에서는 바로 볼 수 없고, 자바스크립트 언어에서 ‘꼬리 재귀 최적화’라는 기능을 지원해주기 때문이다. 이러한 이유로, 꼬리 재귀에서 return 값은 마지막(tail - 꼬리)부분에 있어야한다.

재귀 함수 예시

1
2
3
4
5
6
function factorial(n) {
  if (n === 1) {
    return total;
  }
  return n * factorial(n - 1);
}

꼬리 재귀 예시

1
2
3
4
5
6
function factorial(n, total = 1) {
  if (n === 1) {
    return total;
  }
  return factorial(n - 1, n * total);
}

출처: https://joooing.tistory.com/entry/재귀-→-꼬리-재귀-Tail-Recursion [joooing]

둘이 뭐가 다른 걸까?

위에서 설명된 일반 재귀는 값을 받으면, 그 값에 연산을 하고 다시 재귀 함수에 전달해줬다. 하지만 꼬리 재귀는 아무것도 하지 않고 인수로 total 값을 전달만 해준다. 결과 값에 아무 일도 하지 않고 다시 반환하기 때문에, 스택 오버플로우가 발생하지 않게 되는 방식이다.

콜스택과 스택 오버플로우, 꼬리재귀 최적화

자바스크립트는 단일 스레드 프로그래밍 언어이다. 이 말은 쉽게 말하자면, 자바스크립트라는 언어는 안에 들어있는 계산 요정님이 한 명에다가 멀티태스킹은 할 줄 모른다라는 것이다.

그렇기 때문에 콜스택이라는 실행 대기열을 만들고, 하나씩 대기열에서 명령을 꺼내서 처리해준다.

근데 이 요정님께도 역량과 나름의 사정이 존재하기 때문에 우리가 요청할 수 있는 대기열의 최대 길이는 13939개 정도이다.

그래서 많은 양의 함수가 있을 때 요정님께

첫 번째로 값을 받으시구요. 두 번째로 이 값을 곱해서 세 번째로 아까 이 값 드렸던 위치로 전송 부탁드려요.

같이 여러 일로 내용을 나눠서 요청을 하게 되면, 요정님은 파업해버리신다. 이 파업선언이 일반 재귀에서 마주할 수 있는 Uncaught RangeError: Maximum call stack size exceeded이다.

그렇기 때문에 꼬리재귀를 사용해서 요정님이 할 일을 간단 명료하게 줄여주는 것이다. 꼬리재귀를 사용하게 되면

다음 함수 부르실 때, 곱해진 이 값좀 같이 넘겨주세요.

라는 간략화된 요청으로 말할 수 있게된다.


풀이

꼬리 재귀를 구현해서 풀었다. 재귀는 아직 너무 어렵다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const fs = require("fs");

const input = parseInt(fs.readFileSync("/dev/stdin").toString().trim());

function factorial(n, total = 1) {
  if (n === 0 || n === 1) {
    return total;
  } else {
    return factorial(n - 1, n * total);
  }
}

const answer = factorial(input);

console.log(answer);

[백준 문제풀이] 3053번 택시 기하학


3053번 택시 기하학 (Bronze 3)

문제

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

19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다.

택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다.

D(T1,T2) = x1-x2 + y1-y2

두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다.

따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다.

원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합

반지름 R이 주어졌을 때, 유클리드 기하학에서 원의 넓이와, 택시 기하학에서 원의 넓이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반지름 R이 주어진다. R은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다.

풀이

택시 기하학의 개념을 이해하는게 푸는 것보다 오래 걸렸다. 결국 내용을 이해해보면, 택시 기하학에서는 원의 넓이가 2*r^2 였다.


[백준 문제풀이] 4153번 직각삼각형


4153번 직각삼각형 (Bronze 3)

문제

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

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.

입력

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

출력

각 입력에 대해 직각 삼각형이 맞다면 “right”, 아니라면 “wrong”을 출력한다.

풀이

피타고라스의 정리를 이용해서 풀 수 있었다. 나는 최댓값을 구해 빗변으로 삼은 뒤 배열에서 제거해서 했는데, 다른 사람들의 풀이를 보니 정렬을 사용하면 더 효율적으로 할 수 있다는 걸 배웠다.

소스코드 (피타고라스의 정리)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const answerArr = [];
let count = 0;

function isRight(triangle) {
  answerArr.push("wrong");
  const hypo = Math.max(...triangle);
  const index = triangle.indexOf(hypo);
  triangle.splice(index, 1);
  if (
    Math.pow(hypo, 2) ===
    Math.pow(triangle[0], 2) + Math.pow(triangle[1], 2)
  ) {
    answerArr[count] = "right";
  }
}

while (parseInt(input[count][0]) !== 0) {
  const tri = input[count].split(" ").map((num) => parseInt(num));
  isRight(tri);
  count++;
}

console.log(answerArr.join("\n"));

[백준 문제풀이] 3009번 네 번째 점


3009번 네 번째 점 (Bronze 3)

문제

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

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

제한
1 ≤ w, h ≤ 1,000
1 ≤ x ≤ w-1
1 ≤ y ≤ h-1
x, y, w, h는 정수

풀이

직사각형을 만들기 위해 입력에 주어지는 x, y 값들이 결국 두 번씩 반복되어야 한다. x, y 각각 배열을 만들어서 풀었다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const a = input[0].split(" ");
const b = input[1].split(" ");
const c = input[2].split(" ");

const line = [a, b, c];

const xArr = [];
const yArr = [];

let x;
let y;

for (let i = 0; i <= 2; i++) {
  xArr.push(parseInt(line[i][0]));
  yArr.push(parseInt(line[i][1]));
}

for (let l = 0; l <= 2; l++) {
  const xDot = parseInt(line[l][0]);
  const yDot = parseInt(line[l][1]);
  if (xArr.indexOf(xDot) === xArr.lastIndexOf(xDot)) {
    x = xDot;
  }
  if (yArr.indexOf(yDot) === yArr.lastIndexOf(yDot)) {
    y = yDot;
  }
}

console.log(`${x} ${y}`);

[백준 문제풀이] 1085번 직사각형에서 탈출


1085번 직사각형에서 탈출 (Bronze 3)

문제

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

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 x, y, w, h가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

제한
1 ≤ w, h ≤ 1,000
1 ≤ x ≤ w-1
1 ≤ y ≤ h-1
x, y, w, h는 정수

풀이

x, y, w, h, 0, 0 간의 차이 비교를 통해 간단히 풀 수 있었다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");

const x = parseInt(input[0]);
const y = parseInt(input[1]);
const w = parseInt(input[2]);
const h = parseInt(input[3]);

let min;

if (w - x < x) {
  min = w - x;
} else {
  min = x;
}

if (h - y < y) {
  if (h - y < min) {
    min = h - y;
  }
} else if (min > y) {
  min = y;
}

console.log(min);

[백준 문제풀이] 2839번 설탕 배달


2839번 설탕 배달 (Bronze 1)

문제

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

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

풀이

N이 5000까지이기 때문에 단순 반복 계산은 아닐거라고 생각했다.

! 아이디어
나머지와 몫을 사용하면 간단히 풀 수 있지 않을까? 5키로그램 봉지를 최대한 많이 가져가면 가져갈 봉지가 줄어든다.

3의 봉지와 5의 봉지를 반복문 없이 계산할 수 있지 않을까 했는데 어려웠다.

5로 나누어서 나머지가 0이 된다면 제일 적은 봉지 수이기 때문에 반복문에 첫 부분에 조건문으로 넣어주고, 총 무게에서 3을 계속 빼어서 count를 통해 3키로 봉지를 세어서 남은 무게를 5로 나눈 것과 더해주었다.

나중에 알고보니 이게 그리디 알고리즘이었다더라.


[백준 문제풀이] 2775번 부녀회장이 될테야


2775번 부녀회장이 될테야 (Bronze 1)

문제

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

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

제한 시간 : 1초

제한 : 1 ≤ k, n ≤ 14

첫 번째 풀이

제한과 시간을 봤을 때, 각 층이 올라갈때마다 바로 아래층과 이전 방의 값을 더해서 배열로 만들어주는 것으로 구현이 가능할 수 있겠다고 생각했다.

틀림.

두 번째 풀이

자꾸 에러가 나서 2일 동안 고민했는데, 알고보니까 사례 수는 층, 호수를 전부 포함하는 것이라서 반복문을 T번 더 해주어야했다. 어썸 코딩… (2021.11.12.)

풀이 이후 자꾸 에러가 나서 서치를 해봤는데, 이 문제의 아래에 전부 1로된 층을 추가한 뒤, 파스칼의 삼각형으로 접근, 이항정리 문제로 푸는 방법을 찾았다. 오늘도 어썸 코딩.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const T = parseInt(input[0]);

for (let i = 1; i < T * 2; i = i + 2) {
  const k = parseInt(input[i]);
  const n = parseInt(input[i + 1]);
  const apartment = [];

  for (let l = 0; l <= k; l++) {
    apartment.push([1]);
    for (let j = 1; j < n; j++) {
      if (l === 0) {
        apartment[l].push(j + 1);
      } else {
        apartment[l].push(apartment[l - 1][j] + apartment[l][j - 1]);
      }
    }
  }
  console.log(apartment[k][n - 1]);
}

[백준 문제풀이] 10757번 큰 수 A + B


10757번 큰 수 A + B (Bronze 5)

배운 것

문제는 간단했는데, js에서 처리할 수 있는 수에 한계가 있어서 BigInt라는 자료형이 있다는 것을 알게 되었다. BigInt는 끝에 n이 붙기 때문에 string으로 변환해서 출력해주어야한다.

문제

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

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.


[백준 문제풀이] 2869번 달팽이는 올라가고 싶다


2869번 달팽이는 올라가고 싶다 (Bronze 1)

문제

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

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

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

제한시간 : 0.15초

첫 번째 풀이

수가 크기 때문에 반복문을 사용하는 것은 불가능하고, 나눠서 해결하는 방식이라고 생각했다. 다음 날 낮에 올라가는 것까지 계산해야하기 때문에, 미리 낮에 올라가는걸 뺀 후 그 수를 넘는 때를 구하기로 했다.

25%에서 틀림.

두 번째 풀이

25%에서 틀렸다는 것은 예외처리가 잘 되지 못한 것 같다.

floor를 사용해서 문제를 풀었었는데, v – a의 값이 a보다 작으면 반내림을 사용하게 되면 오답이 나오게 되기 때문에 반올림을 사용해서 문제를 풀어야했다.


[백준 문제풀이] 10250번 ACM 호텔


10250번 ACM 호텔 (Bronze 3)

문제

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

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

첫 번째 풀이

문제는 복잡해보이나, 결국 H를 N으로 나눈 몫 + 1이 호수가 되고, 나머지가 층 수가 된다. 각각을 구한뒤 문자열로 만들어 더 해준다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const c = parseInt(input[0]);

for (let i = 1; i <= c; i++) {
  const line = input[i].split(" ");
  const h = parseInt(line[0]);
  const w = parseInt(line[1]);
  const n = parseInt(line[2]);
  const room = Math.ceil(n / h);
  let floor;
  let answer;

  if (n % h === 0) {
    floor = h;
  } else {
    floor = n % h;
  }

  if (room >= 10) {
    console.log(`${floor}${room}`);
  } else {
    console.log(`${floor}0${room}`);
  }
}

[백준 문제풀이] 1193번 분수찾기


1193번 분수찾기 (Bronze 1)

문제

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

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

1/1 1/2 1/3 1/4 1/5 …
2/1 2/2 2/3 2/4 … …
3/1 3/2 3/3 … … …
4/1 4/2 … … … …
5/1 … … … … …
… … … … … …
이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.

X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

첫 번째 풀이

수학 능력이 머리에 없는건지 도저히 모르겠어서 구글링을 해보았다.

수학적인 사고는 자연어로 이루어진 문제를 분석, 해결 가능한 수준으로 나누고 패턴을 찾아내는 과정이라는 말을 읽고 참 인상 깊게 새겼다. 결국 수학은 복잡한 문제를 단순화하고 패턴을 찾아내서 일반화하는 것이라는 걸 읽고 수학에 대한 새로운 생각을 할 수 있었다.

결국 주기성을 찾아내는 것이라고.

패턴화 하려고 노력했고, 답을 참고하지 않고 풀어낼 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim();

const num = parseInt(input);
let range = 1;
let line = 1;
let answer = 0;
let fraction = 0;

if (num === 1) {
  answer = `1/1`;
} else {
  while (range < num) {
    line++;
    range += line;
  }

  if (line % 2 === 1) {
    fraction = range - num + 1;
  } else {
    fraction = line - (range - num);
  }

  answer = `${fraction}/${line - fraction + 1}`;
}

console.log(answer);

[백준 문제풀이] 1712번 손익분기점


1712번 손익분기점 (Bronze 4)

문제

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

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

첫 번째 풀이

A : 고정 비용, B : 생산당 가변 비용, C : 매출

손익분기점을 구하라.

1
2
3
4
5
6
7
8
9
10
11
const answer = 0;
let 매출 = -A;

if (B > C) {
	console.log(-1);
} else {
	while (매출 > 0) {
		매출 += (C  B);
		answer++
	};
};

이와 같이 접근했다. => 시간초과

두 번째 풀이

이 문제가 ‘수학 능력’ 카테고리에 있었다는 것을 간과했었다.

반복문을 써서 풀면 당연히 늦어질 수 밖에 없고, 개당 수익으로 고정 손해 나눠준 뒤 반올림 해준 뒤 +1 해주면 되는 일이었다.

풀이 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");

const a = parseInt(input[0]);
const b = parseInt(input[1]);
const c = parseInt(input[2]);

if (b >= c) {
  answer = -1;
} else {
  answer = Math.floor(a / (c - b)) + 1;
}

console.log(answer);

[백준 문제풀이] 2292번 벌집


2292번 벌집 (Bronze 2)

느낀 점

Keep It Super Simple

문제

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

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

풀이

수열로 풀이 하려고 했는데, 너무 수학적으로 접근했었다는 것을 깨달았다. 그냥 간단하게 한 줄이 늘어날때마다 한 칸이 늘어나게 된다.

1까지는 1번, 7까지는 2번, 19까지는 3번, 37까지는 4번 이와 같이 이동하게 된다. 이걸 수열로 1, 7, 19와 같은 수를 수열로 생각해서 문제에 접근하였다. 입력된 숫자가 포함되는 범위까지의 수를 찾을 때까지 거리를 하나 씩 추가해주었다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
const fs = require("fs");

const number = parseInt(fs.readFileSync("/dev/stdin").toString());

let distance = 1;
let range = 1;

while (number > range) {
  range += distance * 6;
  distance++;
}

console.log(distance);

2021.11.06. 백준 문제풀이


5622번 다이얼 (Bronze 2)

문제

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

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.

할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.

풀이

문자를 나눠서 각 문자를 비교할 수도 있었지만, 아스키 코드로 변환 후 대소비교를 하는 것이 더 도움이 될 것이라고 생각했다.

처음에는 숫자와 문자 사이에 규칙을 찾아서 반복문을 쓰고 싶었지만 PQRS와 WXYZ 같은 문자들 때문에 괜히 꼬일 것 같아서 단순히 조건문만 사용했다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split("");
let answer = 0;

input.forEach((str) => {
  if (str.charCodeAt(0) <= 67) {
    answer += 3;
  } else if (str.charCodeAt(0) <= 70) {
    answer += 4;
  } else if (str.charCodeAt(0) <= 73) {
    answer += 5;
  } else if (str.charCodeAt(0) <= 76) {
    answer += 6;
  } else if (str.charCodeAt(0) <= 79) {
    answer += 7;
  } else if (str.charCodeAt(0) <= 83) {
    answer += 8;
  } else if (str.charCodeAt(0) <= 86) {
    answer += 9;
  } else if (str.charCodeAt(0) <= 90) {
    answer += 10;
  }
});

console.log(answer);

2021.11.05. 백준 문제풀이


1152번 단어의 개수 (Bronze 2)

문제

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

첫 번째 풀이

1
2
3
4
5
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");

console.log(input.length);

배운 것

86%에서 자꾸 틀려서, 예외 처리가 잘못되었다고 알았다.

어떤 경우인지 정확히 모르겠어서 찾아봤는데, 공백만 입력된 경우를 처리하지 못한 것이었다. 매우 쉬운 문제지만, 정답률이 낮은 이유가 있었다.

예외 처리

1
2
3
if (input[0] === "") {
  answer -= 1;
}

나는 이와 같이 예외처리를 해주었다.
해당 문제에 공백이 둘 연속으로 나오지 않는다고 했기 때문에, 전체를 반복문으로 세는 것보다 이것이 더 효율적이라고 생각했다.


2908번 상수 (Bronze 2)

느낀 점

아니 나는 당연히 constant를 말할 줄 알았다.
오늘도 어썸한 개발자 세상

풀이 도중 type 에러가 났었다.
알고보니 newStr 문자열을 상수로 선언해두는 바람에, 새로운 문자열이 들어갈 수 없는 에러였다. 이런걸 보면 나는 아직 브론즈가 맞는데, 오늘 실버로 승급해버렸다. 이건 마치 갓면허 땄을 때의 기분이다.

문제

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

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

첫 번째 풀이

라인을 입력받고, 두 수를 공백으로 split한 다음 각각 문자열에 reverse() 메서드를 사용한 뒤 숫자로 변환해서 대소 비교를 하자.

! 아이디어

3자리 수인데 배열로 변환, reverse() 사용 후, 다시 join()을 사용하는 것보다 그냥 반복문을 쓰는게 낫지 않을까?

최종 풀이

결국 반복문을 사용해서 풀었다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
const a = input[0];
const b = input[1];

function reverseStr(str) {
  let newStr = "";
  for (let i = str.length - 1; i >= 0; i--) {
    newStr = newStr + str[i];
  }
  return newStr;
}

const newA = parseInt(reverseStr(a));
const newB = parseInt(reverseStr(b));

if (newA > newB) {
  console.log(newA);
} else {
  console.log(newB);
}

2021.11.04. 백준 문제풀이


4673번 셀프 넘버 (Silver 5)

문제

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

느낀 점

수학적인 문제는 처음이었지만, 재미있게 풀 수 있었다.

기억에 남는 것은 디버깅 결과 dArray에 특정 수 이상이 입력되지 않았던 것인데 조건문의 사용이 잘못되어서였다.


11654번 아스키 코드 (Bronze 5)

문제

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

배운 것

문자열을 아스키 코드로 변환해주는 메서드 : charCodeAt(문자열 자릿수)

아스키 코드를 문자열로 변환해주는 메서드 : fromCharCode(아스키코드 번호)


10809번 알파벳 찾기 (Bronze 2)

문제

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

배운 것

join() 메서드는 배열의 모든 값을 연결해 하나의 문자열로 만들어준다.

이때, parameter로 받은 값을 모든 값 사이에 separator로 넣어준다.

처음엔 문자열에 공백과 값을 추가하는 방식으로 출력했는데, 메모리 초과가 나와서 이 방법을 사용했다.


2675번 문자열 반복하기 (Bronze 2)

문제

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

배운 것

자바스크립트에서는 repeat(반복 횟수) 메서드를 통해서 문자열을 반복할 수 있다.


2021.11.02. 백준 문제풀이


3052번 나머지 (Bronze 2)

문제

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

느낀 점

배열에서는 for보다 forEach를 쓰자.

trim 사용을 생활화 하자.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().split("\n");

const bal = [];

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

console.log(bal.length);
});

2021.11.01. 백준 문제풀이


10951번 A + B – 4 (Bronze 3)

문제

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

느낀 점

반복문을 사용할 때 카운팅 변수의 흐름을 잘 생각하자.


1110번 더하기 사이클 (Bronze 1)

문제

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

느낀 점

  1. break를 사용하는 while문에 익숙해지자.
  2. 나머지와 몫을 사용해 자릿 수 별 숫자를 구하는 방식을 이해하자.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const fs = require("fs");

const input = parseInt(fs.readFileSync("/dev/stdin").toString());

let count = 0;
let num = input;
let onenumber, tennumber;

while (true) {
    count++;
    tennumber = Math.floor(num / 10);
    onenumber = num % 10;
    num = (onenumber * 10) + ((onenumber + tennumber) % 10);
    if (num === input) break;
}

console.log(count)
});

2021.10.31. 백준 문제풀이


14681번 사분면 고르기 (Bronze 4)

문제

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

배운 것

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", (line) => {
  input.push(parseInt(line));
}).on("close", () => {
  const x = input[0];
  const y = input[y];

  let output = 1;

  if (x < 0) {
    output = 2;
    if (y < 0) {
      output = 3;
    }
  } else if (y < 0) {
    output = 4;
  }

  console.log(output);

  process.exit();
});

2884번 알람 시계

문제

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

느낀 점

toString()을 toSting()으로 적어놨었다.

카페 올 때 Englishman in newyork을 들으면서 왔었는데 그 탓이지 싶다.

앞으로 에러가 발생하면 오타를 먼저 찾는 습관을 길러야겠다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const fs = require("fs");

const input = fs.readFileSync("/dev/stdin").toString().split(" ");

let hour = parseInt(input[0]);
let minute = parseInt(input[1]);

if (minute - 45 < 0) {
  if (hour == 0) {
    hour = 23;
  } else {
    hour -= 1;
  }
  minute += 15;
} else {
  minute -= 45;
}

console.log(`${hour} ${minute}`);

2021.10.29. 백준 문제풀이


10171번 고양이 (Bronze 5)

문제

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

배운 것

문자열 이스케이프 문자, 역슬래시(\) : 어떤 한 문자를 코드가 아닌 문자로 만들어주는 문자

역슬래시를 문자 그대로 쓰려면 \\ 와 같은 형태로 작성해야함. 이외에도
' : 작은따옴표
" : 큰따옴표
\n : 개행
\t : 탭


1000번 A + B (Bronze 5)

문제

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

배운 것

브라우저에서 작동되는 js 언어는 값을 입력받을 수 없어서, Node.js의 fs 모듈을 이용해서 진행해야한다.

fs 모듈 : FileSystem 모듈로, 파일 처리와 관련된 작업을 한다.

fs.readFile(filename, [options], callback) : filename의 파일을 [options]의 방식으로 읽은 후 callback으로 전달된 함수를 호출함. (비동기적)

fs.readFileSync(filename, [options]) : filename의 파일을 [options]의 방식으로 읽은 후 문자열을 반환함.(동기적)

fs 모듈로 stdin을 로드 fs 모듈을 이용하여 표준입력(stdin) 파일을 동기적으로 불러오는 방법
=> 한 칸 띄어쓰기로 구분되게 된다.

fs 모듈을 통해 문자열로 불러와졌기 때문에, parseInt를 통해 숫자로 변환해주어야 한다.


10869번 사칙 연산 (Bronze 5)

문제

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

느낀 점

문제에서 예제 출력을 잘 읽고, 출력형태가 어떤지 확인해서 Type이나 소수점을 신경써주자.


Check out other tags: