JS) BoJ 1157 단어 공부

반응형

문제

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

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제 입력 1 복사

Mississipi

예제 출력 1 복사

?

예제 입력 2 복사

zZa

예제 출력 2 복사

Z

예제 입력 3 복사

z

예제 출력 3 복사

Z

예제 입력 4 복사

baaa

예제 출력 4 복사

A

 

string 내에 같은 문자를 세어주는 함수는 딱히 없는 것 같아서

문자를 char code로 바꿔준 뒤 반복문을 이용해서 직접 비교했다.

// 입력
const fs = require('fs');
const filePath = process.platform === 'linux'? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString(); // 입력이 한줄로 끝나니 split을 안씀

let strArr = []; // char 을 char code 로 바꿔서 넣을 array
let numTimes = []; // char가 있는지 확인하고 있으면 숫자를 증가시키고 아니면 1을 넣는다
for (let i = 0; i < input.length; i++) {
  // strArr에 숫자 넣기
  // 대문자
  if(input.charCodeAt(i)<97) { 
    // index가 너무 뒤로 밀리는걸 방지하기 위해 대문자 A의 code인 65를 빼줌
    let temp = input.charCodeAt(i)-65; 
    // 이미 있으면 값을 +1 해줌  /  int로 안바꿔주면 NaN 출력...
    if (strArr.includes(temp)) numTimes[temp] = parseInt(numTimes[temp])+1;
    else { // 아니라면 1을 대입해줌
      numTimes[temp] = 1;
      strArr[i] = temp;
    }
  } else {  // 소문자
    // index가 너무 뒤로 밀리는걸 방지하기 위해 소문자 a의 code인 65를 빼줌
    let temp = input.charCodeAt(i)-97;
    // 이미 있으면 값을 +1 해줌  /  마찬가지로 int로 바꿔줌
    if (strArr.includes(temp)) numTimes[temp] = parseInt(numTimes[temp])+1;
    else { // 아니라면 1을 대입해줌
      numTimes[temp] = 1;
      strArr[i] = temp;
    }
  }
}

// numTimes에서 최댓 값을 구해주는 반복문
let big = 0;
for (let i = 0; i < numTimes.length; i++) {
  if (big<numTimes[i]) big = numTimes[i];
}

// 최댓값의 index 값을 구한 뒤
let bigIndex = numTimes.indexOf(big);
// numTimes에서 최댓값 index 뒤부터 동일한 값이 있는지 찾는다
if (numTimes.indexOf(big, bigIndex+1) > bigIndex) { // 있으면 ? 출력
  // numTimes.indexOf(big, bigIndex+1)만 넣으면 - 값도 True로 판별되기 때문에 
  // index 값보다 클 때로만 해준다.
  console.log('?');
} else console.log(String.fromCharCode(bigIndex+65)); // 없으면 대문자 출력

 

거의 50줄에 다다르는데,, 더 짧은 코드들을 확인해보아야겠다.

반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

JS) BoJ 2675 문자열 반복  (0) 2021.08.01
JS) BoJ 8958 OX퀴즈  (0) 2021.08.01
JS) BoJ 1929 소수 구하기/ 에라토스테네스의 체  (0) 2021.07.31
JS) BoJ 1978 소수 찾기  (0) 2021.07.31
JS) BoJ 1546 평균  (0) 2021.07.30