[백준] 3568 iSharp JavaScript

·2024년 6월 22일

문제

선영이는 C, C++, Java와는 다른 아주 세련된 언어를 만들었다. 선영이는 이 아름답고 예술적인 언어의 이름을 i#으로 정했다.

i#은 기본 변수형과 배열([]), 참조(&), 포인터(*)를 제공한다. 배열, 참조, 포인터는 순서에 상관없이 혼합해서 사용할 수 있다. 즉, int의 참조의 참조의 배열의 포인터도 올바른 타입이다. int&&[]*

i#은 여러 개의 변수를 한 줄에 정의할 수 있다. 공통된 변수형을 제일 먼저 쓰고, 그 다음에 각 변수의 이름과 추가적인 변수형을 쓰면 된다. 예를 들면 아래와 같다.

int& a*[]&, b, c*;

a의 타입은 int&&[]*, b는 int&, c는 int&*이 된다. 변수의 오른편에 있는 변수형은 순서를 뒤집어서 왼편에 붙일 수 있다. 따라서, int*& a는 int a&*와 같다.

변수의 선언이 보기 복잡하고 혼란스럽기 때문에, 앞으로는 한 줄에 변수를 하나씩 선언하려고 한다.

i#의 변수 선언문이 주어진다. 이때, 각각의 변수의 오른편에 있는 변수형을 모두 왼쪽으로 옮기고, 한 줄에 하나씩 선언하는 프로그램을 작성하시오.

입력

첫째 줄에 i#의 변수 선언문이 주어진다. 이 선언문에는 변수가 여러개 포함되어 있을 수도 있다.

선언문의 가장 처음에는 기본 변수형이 주어진다. 그 다음에는 추가적인 변수형이 주어진다. 추가적인 변수형은 없을 수도 있다. 그 다음 공백 이후에는 변수 선언이 하나씩 주어진다. 변수 선언은 콤마와 공백으로 나누어져 있고, ;로 끝난다. 각 변수의 선언 처음에는 기본 변수명이 주어진다. 그 다음에는 추가적인 변수형이 주어진다. 추가적인 변수형은 없을 수도 있다.

기본 변수형과 변수명은 같지 않으며, 알파벳 소문자와 대문자로만 이루어져 있다. 각 줄의 길이는 120글자를 넘지 않는다.

출력

입력으로 주어진 변수 선언문을 문제의 조건에 맞게 변형한 뒤, 한 줄에 하나씩 출력한다. 변수형과 변수명 사이에는 공백이 하나 있어야 한다. 출력은 입력으로 주어진 변수 선언문에서 변수가 선언된 순서대로 출력한다.

예제 입력

int& a[]&, b, c;

예제 출력

int&&[] a;
int& b;
int&
c;

내가 했던 풀이 방법

  1. 입력받은 변수 선언문을 ";"를 제거한 뒤, ", "을 기준으로 분할해준다. (","가 아닌 ", "임에 주의한다.)
  2. commad 배열을 순회해준다. 이때, 첫 번째 요소에는 공통된 변수명이 포함되어 있으므로, index가 0일 경우에는 공백을 기준으로 선언문을 분할해준다. 이때 가장 처음에 있는 요소가 공통된 변수명이 된다. 그 외의 요소를 variable에 저장해준다. index가 0이 아닐 때는 command의 모든 요소를 variable에 저장해준다.
  3. index를 0으로 두고, variable이 "[", "&" 또는 "*"이 되기 전까지를 variableName에 저장해준다. 추가 변수형이 없을 수 있으므로, index가 variable의 길이보다 커질 경우 반복문을 중단해준다.
  4. 계산된 index 이후의 변수명을 모두 add에 저장해준다. add에 저장된 변수를 역순으로 뒤집어준다. 이때 "[]"은 "]["로 변하므로, relace를 이용해 "]["의 경우는 "[]"로 다시 바꿔준다.
  5. 변수 선언문을 "{공통 변수형}{추가 변수형} {변수명};" 형태로 만들어준 뒤, answer에 저장해준다.

코드

var fs = require('fs');
let command = fs.readFileSync(0, 'utf-8').toString().trim();

command = command.replace(';', '').split(', ');

let dup = '';
let answer = '';
let variable = '';
for (let i = 0; i < command.length; i++) {
  if (i === 0) {
    dup = command[i].split(' ')[0];
    variable = command[i].split(' ')[1];
  } else variable = command[i];

  let index = 0;
  let variableName = '';
  while (true) {
    if (variable.charAt(index) === '[' || variable.charAt(index) === '&' || variable.charAt(index) === '*') break;
    if (index === variable.length) break;
    variableName += variable.charAt(index++);
  }

  let add = variable.substring(index).split('').reverse().join('');
  add = add.replaceAll('][', '[]');

  answer += `${dup}${add} ${variableName};` + '\n';
}

console.log(answer.trim());

회고

문자열 가지고 놀기는 너무 재밌다

profile
Frontend🍓

0개의 댓글