본문 바로가기
개발아닌개발/알고리즘문제풀이

[백준 알고리즘] 2011번 문제 암호코드

by 불청객 2021. 11. 8.
반응형

 

 

2011번: 암호코드

 

문제 풀이

int num2011_secretcode()
{
	int len = 0;
	string str;
	cin >> str;

	len = str.size();

	//1) 암호가 잘못된 경우 반환
	//if(len>5000){ cout << 0;  return 0;}
	//2) 암호가 잘못된 경우 이어감
	if(len>5000)
	{
		str[4999] = NULL;
		len = 5000;
	}

	int *strArr = new int[len+1];
	memset(strArr,0,sizeof(int*)*(len+1));

	int num = 0;
	int validnum = 0; 

	//기본값과 한자리 수 일때는 1 fix
	strArr[0] = strArr[1] = 1;
	//인덱스 맞추기위한 쓸데없는 값 넣기
	str = " " + str;

	//첫번째 글자 확인 시작부터 암호 아니면 잘가라 
	if(str[1]-'0' > 0 && str[1]-'0' < 10){
		for(int i = 2; i<=len; i++)
		{
			num = str[i]-'0';

			//1) 정상 범주 내의 숫자
			if(num > 0  && num < 10) {
				//분리된 알파벳(default)
				strArr[i] = strArr[i-1];

				validnum = (str[i-1]-'0') * 10 + num;
				//알파벳 범주안에 드는지 확인
				//이전 분리된 숫자와 합칠 수 있음(분리되어있던 케이스들 합쳐야함)
				if(validnum > 0 && validnum <=26)
					strArr[i] += strArr[i-2];
				strArr[i] %= mod;
			}
			//2) 0인 경우 앞의 분리된 숫자와 합치기
			else if(num == 0)
			{
				validnum = (str[i-1]-'0') * 10 + num;
				if(validnum > 0 && validnum <=26)
				{
					strArr[i] = strArr[i-2];
				}
			}
			//3) 갑분 이상한 문자 -> 암호 불가 
			else break;
		}
	}
	cout << strArr[len];
	strArr = NULL;
	delete strArr;
	return 0 ;
}

 

 

백준알고리즘 난이도... 안풀다 풀어서 그런가

봐도봐도 이해 잘 안됨 ㅠㅠ...

알듯말듯한데 그냥 돌아다니는 소스답 보고 원리 찾아서 구현함

 

 

1. 문자형의 숫자 - '0' 하면 숫자가 되버림

2. string 엄청 편함. c언어에서는 지원 안되므로 cin cout 쓸것

​- strArr[1] 은 첫번째 문자에 대한 경우의 수

- str[1]은 첫번째 문자

 

 

정말 피보나치 수열이 생각나는 문제였다........ 다음에 꼭 다시풀어보기

728x90
반응형

댓글