전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

PS/BOJ

BOJ 2011 암호코드

2021. 7. 12. 03:54

boj 2011 암호코드

- 문제 링크

https://www.acmicpc.net/problem/2011

- 문제 해설

DP를 이용하여 간단히 풀 수 있는 문제이다. D[i]가 주어진 암호의 i번째까지에서 해석할 수 있는 가짓수라고 하자. 끝 두자리의 숫자가 10 ~ 26 범위이면 한자리 숫자 2개가 될 수도 있고 두자리 숫자 1개가 될 수도 있다는 점을 생각하면 문제를 쉽게 해결할 수 있다. 생각해볼 사항들이 무엇이 있는지 살펴보자.

  1. 암호의 처음 숫자가 0일 시에는 0을 출력한다.
  2. 맨 끝 한 자리가 0인 경우는 맨 끝 두 자리가 10, 20인 경우를 제외하고는 암호가 성립할 수 없다. 예를 들면 맨 끝 두 자리가 00, 30, 40 ... 90 같은 경우는 대응되는 알파벳이 없기에 암호가 성립되지 못한다. D[i]가 전역 배열로 지정되어있어 0으로 초기화되어있기 때문에 이런 경우는 따로 코드로 구현해주지 않아도 된다.
  3. 맨 끝 한 자리 숫자가 1~9 범위인 경우를 D[i] = D[i - 1]로 설정한다.
  4. 맨 끝 두 자리 숫자가 10-26 범위이면, D[i] = D[i] + D[i - 2]라고 설정한다. 끝 한 자리가 1-9 범위이면서 끝 두 자리가 10-26 범위이면, 위에서 처리해놓은 D[i]에 의해 D[i] = D[i - 1] + D[i - 2] 형태이다.

- 코드 보기

code 배열은 암호를 담는 배열이고, 변수 num1은 끝 한 자리를 num2는 끝 두 자리를 의미한다.

#include <iostream>
using namespace std;

string code;
int D[5005];

int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> code;

    D[0] = 1;
    D[1] = 1;

    if (code[0] == '0')
    {
        cout << 0;
        return 0;
    }

    for (int i = 2; i <= code.size(); i++)
    {
        int num1 = code[i - 1] - '0';
        int num10 = (code[i - 2] - '0') * 10 + code[i - 1] - '0';

        if (num1 != 0) D[i] += (D[i - 1]) % 1000000;
        if (num10 >= 10 && num10 <= 26) D[i] += (D[i - 2]) % 1000000;
    }

    cout << D[code.size()] % 1000000;
}
저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 10814 나이순 정렬  (0) 2021.07.14
BOJ 11052 카드 구매하기  (0) 2021.07.12
BOJ 2225 합분해  (0) 2021.07.09
BOJ 9461 파도반 수열  (0) 2021.07.09
BOJ 2133 타일 채우기  (0) 2021.07.08
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 10814 나이순 정렬
    • BOJ 11052 카드 구매하기
    • BOJ 2225 합분해
    • BOJ 9461 파도반 수열
    모달조아
    모달조아

    티스토리툴바