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)
});