백준 1157번 Node.js 문제풀이

Cho Dragoo·2021년 5월 21일
0

JavaScript 백준 온라인 알고리즘 공부

백준 1157 번 Node.js 문제풀이

단어 공부
https://www.acmicpc.net/problem/1157



본인이 제출했으나 틀린답안

// 첫번째 제출

const fs = require("fs");
const input = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `baaa`
)
  .trim()
  .split("\n");

let alphCountArr = [];
let maxCount = 0;
let overlapCount = 0;
let answer;
let words = input[0].toUpperCase().split("");

let a = "A".charCodeAt();
let z = "Z".charCodeAt();

for (let i = a; i <= z; i++) {
  let count = 0;
  let alph = String.fromCharCode(i);
  let position = words.indexOf(alph);
  while (position !== -1) {
    count++;
    position = words.indexOf(alph, position + 1);
    if (count >= maxCount) {
      maxCount = count;
      answer = String.fromCharCode(i);
    }
  }
  alphCountArr += count;
}

let countArr = alphCountArr.indexOf(maxCount);
while (countArr !== -1) {
  overlapCount++;
  countArr = alphCountArr.indexOf(maxCount, countArr + 1);
  if (overlapCount >= 2) {
    answer = "?";
  }
}

console.log(answer);

// 중복을 제거하는 코드를 수정하고 제출 

const fs = require("fs");
const input = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `baaa`
).trim();

let alphCountArr = [];
let maxCount = 0;
let answer;
let words = input.toUpperCase().split("");

let a = "A".charCodeAt();
let z = "Z".charCodeAt();

for (let i = a; i <= z; i++) {
  let count = 0;
  let alph = String.fromCharCode(i);
  let position = words.indexOf(alph);
  while (position !== -1) {
    count++;
    position = words.indexOf(alph, position + 1);
    if (count >= maxCount) {
      maxCount = count;
      answer = String.fromCharCode(i);
    }
  }
  alphCountArr += count;
}

let newArr = alphCountArr.split("").sort((a, b) => a - b);
let lastPos = newArr[newArr.length - 1];
let laftPos = newArr[newArr.length - 2];
if (lastPos === laftPos) {
  answer = "?";
}

console.log(answer);

풀이과정 소감

  • 분명 VScode에서 모든 예제 입출력이 정상적으로 나오는 걸 확인하고 코드를 제출했으나 채점 50%지점에 이르자 틀렸다는 판정이 나왔다.

    혹시나해서 알파벳 중복을 고르는 코드를 while문이 없게 고쳤지만 오히려 틀렸다는 판정이 곧바로 나왔다. 채점의 기준이 궁금한 경우가 아닐 수 없었다.


const fs = require("fs");
const input = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `aaaaaaaaaaaaaaaaaajjjdddddddddddddddddddddddddddddddddddddddddZ`
).trim();

let alphCountArr = [];
let maxCount = 0;
let answer;
let words = input.toUpperCase().split("");
let overlapCount = 0;

let a = "A".charCodeAt();
let z = "Z".charCodeAt();

for (let i = a; i <= z; i++) {
  let count = 0;
  let alph = String.fromCharCode(i);
  let position = words.indexOf(alph);
  while (position !== -1) {
    count++;
    position = words.indexOf(alph, position + 1);
    if (count >= maxCount) {
      maxCount = count;
      answer = String.fromCharCode(i);
    }
  }
  alphCountArr += count; //<--- count라는 숫자가 alphCountArr배열로 들어가면 
                             // 요소끼리 찰떡같이 붙어 넣는걸 반복하게 된다.
}
.
.
.
.

// alphCountArr의 아웃풋의 결과는
// 1800410000030000000000000001

  • 틀린이유는 이 문제에 부적합한 숫자배열을 만들었기 때문이였다.
    지금의 입력창의 문자를 보면 A의 갯수와 D라는 갯수가 9개를 훨씬 넘어간다는 걸 알 수있다.
    이 경우엔 붙어있는 숫자의 문자열이라도 단 한 숫자만 배열에 나누어 들어가기 때문에 첫자리에 18이 들어가도 1과 8이 따로 배열에 자리잡게 된다.
    인풋의 알파벳들은 각각 100개 그 이상도 있어도 알파벳 갯수를 담는 배열의 최대값은 9를 초과해서 받을 수가 없으니 틀린 답일 수밖에 없다.


.
.
.
for (let i = a; i <= z; i++) {
  let count = 0;
  let alph = String.fromCharCode(i);
  let position = words.indexOf(alph);
  while (position !== -1) {
    count++;
    position = words.indexOf(alph, position + 1);
    if (count >= maxCount) {
      maxCount = count;
      answer = String.fromCharCode(i);
    }
  }
  alphCountArr.push(count);  // push()를 이용해야 요소를 각자 감싸는 배열이 생성된다.
}
.
.
.

  • 이제껏 0~9까지만 고르는 배열만 보다가 그런지 10이상을 담아야하는 배열에 문제 있음을 오랜동안 발견 못 한게 너무나 아쉬웠다.
    이미 요소를 담는걸 마친 배열은 split("")메서드가 요긴하지만 빈 배열에 하나하나씩 받는건 안통하며 push()가 가장 무난한 선택이라는 걸 뼈저리게 느꼈다.
    역시나 배열을 영리하게 다루는건 여전히 쉽지가 않다....
profile
어떤 문제든 파악 할 수 있으며 해결책을 찾을 수 있는 개발능력을 꿈꾸고 있습니다.

0개의 댓글