[알고리즘] 짝지어 제거하기

2022. 5. 21. 14:25·알고리즘
반응형

문제 설명

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항

  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

입출력

s result
baabaa 1
cdcd 0

나의 풀이

const s = "baabaa";

function solution(s) {
  for (let i = 0; i < s.length - 1; i++) {
    if (s[i] === s[i + 1]) {
      s = s.split(`${s[i] + s[i + 1]}`).join("");
      i -= 2;
    }
  }

  return s.length === 0 ? 1 : 0;
}

console.log(solution(s));

최초엔 지난번 문자열 압축 풀이와 비슷하게, 비교를 하는 방식으로 진행했다. 

하지만 이럴 경우 문자열이 길어지면 작업 시간이 그만큼 길어져서 코드를 변경하였다. 

 

const s = "zyxvutxrrxtuvxyz";

function solution(s) {
  // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
  const check = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i",
    "j",
    "k",
    "l",
    "m",
    "n",
    "o",
    "p",
    "q",
    "r",
    "s",
    "t",
    "u",
    "v",
    "w",
    "x",
    "y",
    "z",
  ];

  for (let i = 0; i < check.length; i++) {
    const split = s.split(`${check[i] + check[i]}`);
    s = split.join("");

    if (s.length === 0) {
      break;
    }

    if (split.length >= 2) {
      i = -1;
    }
  }

  return s.length === 0 ? 1 : 0;
}

console.log(solution(s));

a~ z 까지 배열을 만들고 그 배열 내에서 split으로 자르는 방법을 해봤다. 

하지만 오히려 너 많은 작업 시간이 걸려서 이 역시 다시 수정하였다. 

 

const s = "zyxvutxrrxtuvxyz";

function solution(s) {
  // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
  const arr = [];

  for (let i = 0; i < s.length; i++) {
    if (arr[arr.length - 1] !== s[i]) {
      arr.push(s[i]);
    } else {
      arr.pop();
    }
  }

  return arr.length === 0 ? 1 : 0;
}

console.log(solution(s));

배열에 문자를 하나씩 넣어서 마지막 배열의 문자와 현재 배열의 문자를 비교하는 방식으로 풀어보았다. 

 

확실히 작업 속도는 개선되어 풀이를 완료했고

풀고보니 stack 형식으로 풀게 되었다 . 

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

반응형
저작자표시 비영리 변경금지 (새창열림)

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

[알고리즘] 추석 트래픽  (0) 2022.05.28
[알고리즘] 행렬 테두리 회전하기  (2) 2022.05.24
[알고리즘] 타겟 넘버  (1) 2022.05.15
[알고리즘] 기능 개발  (1) 2022.05.13
[알고리즘] 124 나라의 숫자  (1) 2022.05.12
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 추석 트래픽
  • [알고리즘] 행렬 테두리 회전하기
  • [알고리즘] 타겟 넘버
  • [알고리즘] 기능 개발
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    webpack
    리얼클래스
    redux
    타입스크립트
    프로그래머스
    자바스크립트
    react
    덤프
    타일러영어
    네이버 부스트캠프
    javascript
    영어독학
    Babel
    ReactNative
    네트워크
    Docker
    식물
    typescript
    리얼학습일기
    ChatGPT
    영어회화
    알고리즘
    CSS
    다이소
    바질 키우기
    CCNA
    Node.js
    바질
    리액트
    next.js
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[알고리즘] 짝지어 제거하기
상단으로

티스토리툴바