[ 백준 ] 21314 민겸 수 - JavaScript

2025. 4. 20. 00:30·알고리즘

문제

민겸이는 로마 숫자를 보고 굉장히 흥미롭다고 생각했다. 그래서 민겸이는 새로운 수 체계인 민겸 수를 창조했다.

 

민겸 숫자는 0 이상의 정수 N에 대해 10N 또는 5 × 10N 꼴의 십진수를 대문자 M과 K로 이루어진 문자열로 표기한다. 10N 꼴의 십진수는 N + 1개의 M으로, 5 × 10N 꼴의 십진수는 N개의 M 뒤에 1개의 K를 이어붙인 문자열로 나타낸다. 즉, 아래 표처럼 나타낼 수 있다.

 

변환 전 변환 후
1 M
5 K
10 MM
50 MK
100 MMM
500 MMK
1000 MMMM
5000 MMMK
... ...

민겸 수는 한 개 이상의 민겸 숫자를 이어붙여 만든다. 예를 들어, 민겸 수 MKKMMK는 MK, K, MMK의 세 민겸 숫자를 이어붙여 만들 수 있다.

 

민겸 수를 십진수로 변환할 때는, 1개 이상의 민겸 숫자로 문자열을 분리한 뒤, 각각의 민겸 숫자를 십진수로 변환해서 순서대로 이어붙이면 된다. 민겸 숫자를 십진수로 변환하는 것은 십진수를 민겸 숫자로 변환하는 과정을 거꾸로 하면 된다. 예를 들어, 민겸 수 MKKMMK는 아래 그림과 같이 여러 가지 십진수로 변환할 수 있다.

민겸이는 위와 같이 하나의 민겸 수가 다양한 십진수로 변환될 수 있다는 사실을 알았다. 문득 민겸이는 변환될 수 있는 십진수 중 가장 큰 값과 가장 작은 값이 궁금해졌다. 민겸이를 위해 하나의 민겸 수가 십진수로 변환되었을 때 가질 수 있는 최댓값과 최솟값을 구해주자.

 

입력

민겸 수 하나가 주어진다. 민겸 수는 대문자 M과 K로만 이루어진 문자열이며, 길이는 3,000을 넘지 않는다.

출력

주어진 민겸 수가 십진수로 변환되었을 때 가질 수 있는 값 중 가장 큰 값과 가장 작은 값을 두 줄로 나누어 출력한다.

 

입출력 예시

입력 1

MKM

 

출력 1

501
151

 

입력 2

MKKMMK

 

출력 2

505500
155105

 

 


 

 

풀이

'use strict';
const fs = require('fs');

// 백준 제출 할 때 주석 제거
// const readFileSyncAddress = '/dev/stdin';

// VSC 테스트 할 때 주석 제거
const readFileSyncAddress = 'input.txt';

const input = fs.readFileSync(readFileSyncAddress).toString().trim().split('\n');

function substitution(arr) {
  if (arr.length === 0) return '';
  const hasK = arr.find(element => element === 'K');
  let countM = arr.filter(element => 'M' === element).length;

  if (hasK) {
    return String(5n * 10n ** BigInt(countM));
  }

  return String(10n ** BigInt(countM - 1));
}

function findMaxValue(input) {
  const section = [];
  const copy = [...input];
  let length = 0;
  let result = '';

  input.forEach(element => {
    length += 1;
    if (element === 'K') {
      section.push(copy.splice(0, length));
      length = 0;
    }
  });

  copy.forEach(element => section.push([element]));

  section.forEach(element => {
    result += substitution(element);
  });

  return result;
}

function findMinValue(input) {
  const section = [];
  const copy = [...input];
  let length = 0;
  let result = '';

  input.forEach(element => {
    if (element === 'K') {
      section.push(copy.splice(0, length));
      section.push([copy.shift()]);
      length = 0;
    } else length += 1;
  });

  section.push([...copy]);

  section.forEach(element => {
    result += substitution(element);
  });

  return result;
}

console.log(findMaxValue([...input[0]]));
console.log(findMinValue([...input[0]]));

 

'알고리즘' 카테고리의 다른 글

[ 백준 ] 9465 스티커 - JavaScript  (0) 2025.04.09
[ 백준 ] 1325 효율적인 해킹 - JavaScript  (0) 2025.04.09
[ 백준 ] 2512 예산 - JavaScript  (0) 2025.04.04
[ 백준 ] 2961 도영이가 만든 맛있는 음식 - JavaScript  (0) 2025.04.03
[ 백준 ] 1260 DFS와 BFS - JavaScript  (0) 2025.03.31
'알고리즘' 카테고리의 다른 글
  • [ 백준 ] 9465 스티커 - JavaScript
  • [ 백준 ] 1325 효율적인 해킹 - JavaScript
  • [ 백준 ] 2512 예산 - JavaScript
  • [ 백준 ] 2961 도영이가 만든 맛있는 음식 - JavaScript
seio924
seio924
seio924 님의 블로그 입니다.
  • seio924
    seio924 님의 블로그
    seio924
  • 전체
    오늘
    어제
    • ROOT (51)
      • Mark Up (1)
      • Style Sheet (1)
      • Language (5)
        • JavaScript (5)
      • CS (0)
      • 알고리즘 (26)
      • 디자인 패턴 (1)
      • Develop (8)
      • 디자인 툴 (1)
      • COCOMU (8)
      • FRIENDY (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    cocomu
    DFS
    프로그래머스
    react
    라이브러리 제작
    s3
    배포
    gpt-error-analyzer
    CloudFront
    spa fallback
    특수문자 코드
    llm
    javascript
    figma
    이분탐색
    그리디
    백준
    디스코드 봇 제작
    코코무
    GPT
    DP
    완전탐색
    storybook
    Pretendard
    알고리즘
    html
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
seio924
[ 백준 ] 21314 민겸 수 - JavaScript
상단으로

티스토리툴바