백준 3568 iSharp

걍걍규·2023년 7월 19일
0
post-thumbnail

문제 분석하기

  • 입력 중 int& 부분은 변수 선언문이다

  • 그 다음에 오는 잡다한 특수문자 및 알파벳은 뒤집어져서 나열된다

  • 변수 선언과 특수문자는 붙어있고 알파벳은 한번 띄워준 후 세미콜론으로 마무리한다

  • 첫인상은 그냥 문자열 구현문제 ? 정도로 느껴졌고 팀원 분께서 한번 설명해 준 기억이 있었지만 내 식대로 해석해서 풀려고 노력했다

const fs = require("fs");
//const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const input = fs
  .readFileSync("example.txt", "utf8")
  .toString()
  .trim()
  .split("\n");

const datas = input.join("").replaceAll(",", "").replaceAll(";", "").split(" ");
const result = [];

const vari = datas.shift();

const reg = /[a-zA-Z]/;

const divide = (data) => {
  let alph = [];
  let schar = [];
  for (const el of data) {
    if (reg.test(el)) {
      alph.push(el);
    } else if (el === "[") {
      schar.push("]");
    } else if (el === "]") {
      schar.push("[");
    } else if (!reg.test(el)) {
      schar.push(el);
    }
  }
  return `${vari}${schar.reverse().join("")} ${alph.join("")};`;
};

for (let i = 0; i < datas.length; i++) {
  let str = divide(datas[i]);
  result.push(str);
}

console.log(result.join("\n"));

코드 설명 풀이

  • 첫번째로 데이터 가공 부분에서 join을 이용하여 배열을 문자열로 변환 후 replaceAll 문자열 메서드를 이용하여 모든 쉼표와 세미콜론을 없애주었다.

  • 그 후에 다시 문자열 메서드인 split을 이용하여 각각의 요소들을 배열로 나눠주었고 그 중에 첫번째 요소인 int&를 vari라는 변수에 전달하며 datas 배열에서는 삭제해주었다.

  • reg라는 변수 안에는 알파벳을 구별해주는 정규식을 선언해주었고 변수 선언 시 특수문자와 알파벳을 구별해 주는 역할을 해줄것이다.

  • divide라는 함수를 반복문 내부에서 호출하여 datas 배열의 모든 인덱스를 탐색하여 알파벳과 특수문자를 나누어준 후 예제 출력과 같은 모양으로 출력해주었다.

특이 사항

  • reverse를 호출하여 모든 특수문자의 순서를 바꾸어주면 []가 ][로 되기 때문에 이부분을 유의하라
  • 나는 else if를 이용하여 [ > ]로 ] > [로 바꾸어 주었으나 replaceAll을 이용해도 무방함을 알 수 있었다
  • 항상 주어진 테스트케이스 말고도 다양한 경우가 있을 수 있다는 점을 잊지 말자 나의 경우에도 alph 변수에 여러개의 알파벳이 들어올 것을 예상하지 못하고 출력을 올바르게 하지 못해 그 원인을 찾느라 고생했었따

끝!

profile
안녕하시오?

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 좋은 정보 감사합니다!

답글 달기