jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바스크립트 커링
  • javascript use strict
  • 가사 검색 자바스크립트
  • 자바스크립트 배열의 특수함
  • 백준 17406 nodeJS
  • 억억단을 외우자 javascript
  • 프로그래머스 숫자카드나누기 javascript
  • 1753 최단경로 javascript
  • 병합정렬 자바스크립트
  • 자바스크립트 모듈 시스템
  • 덧칠하기 javascript
  • 13460 javascript nodejs
  • safari invalid date error
  • 깃 이전 커밋에서 새 브랜치 만들기
  • safari Date format NaN
  • 퀵정렬 자바스크립트
  • 리코쳇 로봇 javascript
  • JavaScript
  • 자바스크립트 이벤트 위임
  • 자바스크립트 sort는 왜 그모양일까
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 계수정렬 자바스크립트
  • 리액트 프로젝트 디버깅하기
  • 대충만든자판 javascript
  • 25632 소수 부르기 게임
  • 백준 자바스크립트 입력 템플릿
  • fetch 취소하기
  • 자바스크립트 채팅방 스크롤
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 외벽 점검 javascript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

[백준] 1157번 단어 공부 - JavaScript(NodeJS)

2021. 6. 9. 10:29

문제

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

풀이

생각보다 엄청 간단하면서 생각보다 까다로울 수 있는 문제다.

문제의 키포인트는 아스키 코드를 활용해서 문자를 숫자로 바꿀 수 있느냐 일 듯 하다.

 

풀이 방향

조건이 생각보다 많다.

 

알파벳 대소문자를 구별하지 않으며,
알파벳 개수를 카운트 해야 하고
가장 많이 사용된 알파벳을 출력하는데, 2개 이상이라면 ?를 출력해줘야 한다.

 

 

내가 풀이한 방향은 다음과 같다.

 

1. 단어를 대문자로 바꾸고 A-Z순으로 정렬한다.

 

2. 단어의 각 알파벳들을 아스키코드를 이용해 A=0, Z=25의 인덱스 취급하여 배열에 카운트한다.

 

3. 카운트가 가장 클 때의 배열 인덱스와 최댓값을 갱신한다.


4. 배열 내에서 최댓값을 가지는 인덱스를 뒤에서부터 조회하는데
    뒤에서부터 조회한 인덱스와 최대값의 인덱스가 일치하지 않으면
    가장 많이 사용된 알파벳이 2개 이상 존재한다.

    (1번에서 알파벳 순으로 정렬했으므로 최대값의 인덱스에는 가장 작은 인덱스가 들어간다.)
    2개 이상 존재하면 ? 출력, 1개라면 해당 인덱스를 아스키코드를 이용해 문자화하여 출력한다.

 

코드

function sol(str) {
  str = str.toUpperCase().split("").sort().join("");
  const arr = new Array(26).fill(0);
  let max = Number.MIN_SAFE_INTEGER;
  let maxIdx = -1;

  for (let x of str) {
    const idx = x.charCodeAt() - 65;
    arr[idx]++;
    if (max < arr[idx]) {
      max = arr[idx];
      maxIdx = idx;
    }
  }

  const lastIdx = arr.lastIndexOf(max);
  if (lastIdx !== maxIdx) return "?";
  return String.fromCharCode(maxIdx + 65);
}

// 백준에서 입력을 받는 코드
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    console.log(sol(line));
  })
  .on("close", () => {
    process.exit();
  });


4번 절차에서 filter 메서드를 사용하여 걸러진 배열 크기가 2이상인지 판단해도 된다.

이렇게 하면 단어 알파벳을 정렬하지 않아도 된다.

 

코드2

function sol(str) {
  str = str.toUpperCase().split("");
  const arr = new Array(26).fill(0);
  const maxObj = {
    idx: -1,
    val: Number.MIN_SAFE_INTEGER,
  };

  str.map((x) => {
    const idx = x.charCodeAt() - 65;
    arr[idx]++;
    if (maxObj.val < arr[idx]) {
      maxObj.val = arr[idx];
      maxObj.idx = idx;
    }
  });

  const length = arr.filter((size) => size === maxObj.val).length;
  return length > 1 ? "?" : String.fromCharCode(maxObj.idx + 65);
}

require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    console.log(sol(line));
  })
  .on("close", () => {
    process.exit();
  });
저작자표시 (새창열림)

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 1152번 단어의 개수 - JavaScript(NodeJS)  (0) 2021.07.01
[백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS)  (0) 2021.06.09
[백준] 9663번 N-Queen - JavaScript(NodeJS)  (1) 2021.06.08
[백준] 16198번 에너지 모으기 - JavaScript(NodeJS)  (0) 2021.06.08
[백준] 16197번 두 동전 - JavaScript(NodeJS)  (0) 2021.06.07
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 1152번 단어의 개수 - JavaScript(NodeJS)
    • [백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS)
    • [백준] 9663번 N-Queen - JavaScript(NodeJS)
    • [백준] 16198번 에너지 모으기 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바