[JS] 백준 1157 - 단어공부

n-u·2022년 7월 24일
0

Algorithm

목록 보기
30/33
post-thumbnail

백준 1157 - 단어공부

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

제출한 풀이

const fs = require("fs");
const file = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(file).toString().toUpperCase().split("");
//아스키코드를 이용하기 위해 전체 문자열을 대문자로 변환시켜준다.

let Arr = new Array(26).fill(0);

for (let i = 65; i < 91; i++) {
  for (let j = 0; j < input.length; j++) {
    if (i === input[j].charCodeAt(0)) {
      Arr[i - 65] += 1;
    }
  }
}

let count = 0;
let maxNum = Math.max(...Arr);

Arr.map((elem) => {
  if (elem === maxNum) count++;
});

count === 1
  ? console.log(String.fromCharCode(Arr.indexOf(maxNum) + 65))
  : console.log("?");
  • 문제 접근
    • 아스키코드를 이용 (대문자 알파벳 : 65 - 90)
    • 알파벳 개수만큼을 가진 배열을 생성(0-25) -> 0 : A, 1: B .... 25 : z
    • 알파벳 배열에 숫자를 이용해 중복된 값이 있는지 확인
    • 중복 된 값이 있다면 ? 출력 / 아니면 알파벳 배열에 인덱스를 찾고 + 65의 숫자 값을 아스키코드의 알파벳으로 변환
let Arr = new Array(26).fill(0);

알파벳 개수에 맞는 배열 생성 / 0으로 다 채움

for (let i = 65; i < 91; i++) {  //아스키코드를 확인하기 위한 i
  for (let j = 0; j < input.length; j++) { //input의 배열을 순회하기 위한 j
    if (i === input[j].charCodeAt(0)) { //i와 input의 요소의 아스키코드가 같다면?
      Arr[i - 65] += 1;
      //같다면 Arr배열에 넣는데, Arr배열을 0부터 25까지 밖에 없음 
      //즉, (아스키코드 - 65)를해야 배열에 잘 넣을 수 있음
    }
  }
}

input안에 있는 철자들이 아스크코드와 맞는지 확인 후 맞다면 1을 더해준다.

let count = 0;
let maxNum = Math.max(...Arr);
//Max.max는 배열을 그대로 넣을 수 없어 스프레드 연산자를 이요해서 넣어야 작동된다. 아니면 apply이용

Arr.map((elem) => {
  if (elem === maxNum) count++;
});

Arr의 배열을 순회해 count를 더한다.
count는 중복수를 알아보기 위한 변수

count === 1
  ? console.log(String.fromCharCode(Arr.indexOf(maxNum) + 65))
  : console.log("?");

count값이 1이라면 숫자를 알파벳으로 변환(아스키코드이용String.fromCharCode())
count값이 1보다 크다면 -> 중복된 값이 있다는 뜻이므로, "?"를 출력한다.

문제를 풀면서 알게 된 것

  • toUpperCase()
  • String.fromCharCode()
  • Math.max(...Array)


Reference

https://onelight-stay.tistory.com/368
https://gurtn.tistory.com/49

profile
기록하며 발전하는 삶

0개의 댓글