알고리즘 문제/[백준]

[백준] 1662 압축

latter2005 2021. 3. 4. 17:58
 

1662번: 압축

압축되지 않은 문자열 S가 주어졌을 때, 이 문자열중 어떤 부분 문자열은 K(Q)와 같이 압축 할 수 있다. K는 한자리 정수이고, Q는 0자리 이상의 문자열이다. 이 Q라는 문자열이 K번 반복된다는 뜻이

www.acmicpc.net

문제 확인

 

괄호를 기준으로 이전 길이 값이 변경되므로 스택을 활용해서 풀 수 있습니다.

 

풀이

 

배열을 따라가면서 문자마다 3가지 경우로 나눌 수 있습니다.

  1. '(' : 바로 이전의 숫자의 곱만큼 길이가 길어지므로 ary[i-1], 이전 문자열의 길이를 저장합니다.
  2. ')' : 기록해둔 스텍을 반영합니다.
  3. 문자 : 현재 길이를 +1 합니다.

스택을 재활용하기 때문에 ')' 문자를 만나면 결과를 반영한 후 stack[top]=0 으로 초기화를 해 주어야 합니다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
#include <cstring>
int main() {
    char ary[51];
    
    scanf("%s", ary);
 
    int n = strlen(ary);
    int stk[50= { 0 }, rec[50], top = 0;
    for (int i = 0; i < n; i++) {
        if (ary[i] == '(') {
            --stk[top];
            rec[++top] = ary[i - 1- '0';//문자로 입력받은 수를 K로 변경
        }
        else if (ary[i] == ')') {
            stk[top - 1+= rec[top] * stk[top];
            stk[top--= 0;//스택 반영
        }
        else {
            ++stk[top];//길이 증가
        }
    }
    printf("%d", stk[0]);
}
 
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 5670 휴대폰 자판  (0) 2021.03.04
[백준] 9020 골드바흐의 추측  (0) 2021.03.04
[백준] 1937 욕심쟁이 판다  (0) 2021.03.04
[백준] 1786 찾기  (0) 2021.03.02
[백준] 1298 노트북의 주인을 찾아서  (0) 2021.02.22