본문 바로가기
Data science/알고리즘 학습

정올 1620 : 전화번호 속의 암호 (c++)

by ggoboogi_house 2022. 2. 8.
반응형

* 문제 링크 :

http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=893&sca=99&sfl=wr_hit&stx=1620

 

** 문제 풀이 방법

1) 전화번호 문자열 크기 확인
2) 하이픈 갯수 및 위치 찾기
3) 각 더미의 시작점 확인
4) 조건 판별
     - 각 더미의 크기가 4보다 작을 경우 부족한 만큼 ‘0’ 채우기
     - 더미들 중 4보다 큰 더미가 있을 경우 오류메시지 출력 및 종료
5) 조건에 맞게 암호 생성 후 반환

 

*** 코드

#include <stdio.h>
#include <cmath>

struct Dum {
	int arr[5];
};

using namespace std;

char str[101];
int P, M;
int ans=0;
Dum dummy[101];

long lengthOfArray(const char* arr)
{
	long size = 0;

	while (*arr) {
		size += 1;
		arr += 1;
	}

	return size;
}

int main() {

	freopen("input1620.txt", "r", stdin);  // 본인 파일 입력

	scanf("%s ", str);
	scanf("%d%d", &P, &M);

	//입력이 잘 들어왔나 확인
	//printf("%s\n", str);
	//printf("%d %d\n", P, M);

	//int len = strlen(str);  //<string.h> 사용 가능할 경우 이것 바로 사용
	int len = lengthOfArray(str);
	
	int dummy_cnt = 0;
	int harr[101] = { 0, };
	for (int i = 0; i < len; i++) {
		if (str[i] == '-') {
			dummy_cnt++;
			harr[dummy_cnt] = i+1;
		}
	}

	dummy_cnt++;		// 하이픈 갯수보다 더미의 갯수가 1개 더 많으므로 1 추가
	harr[dummy_cnt] = len+1;
	for (int i = 0; i < dummy_cnt; i++) {
		int dummy_len = harr[i + 1] - harr[i];

		if (dummy_len < 5) {
			int dummy_start_idx = harr[i];
			int string_short = 5 - dummy_len;
			for (int j = 0; j < string_short; j++) {
				dummy[i].arr[j] = 0;
			}
			for (int j = 0; j < dummy_len; j++) {
				dummy[i].arr[string_short+j] = str[dummy_start_idx + j] - '0';
			}			
		}
		else if (dummy_len == 5) {
			int dummy_start_idx = harr[i];
			for (int j = 0; j < 4; j++) {
				dummy[i].arr[j] = str[dummy_start_idx + j] - '0';
			}
		}
		else {
			printf("INPUT ERROR!\n");
			return 0;
		}
	}

	for (int i = 0; i < 4; i++) {
		if (M > dummy_cnt) {			// 더미 갯수보다 M의 값이 클 경우 오류 메시지 반환
			printf("INPUT ERROR!\n");
			return 0;
		}
		else {
			int num_loc = (dummy[M - 1].arr[i] + P) % 10;
			ans += num_loc * pow(10, (3 - i));
		}		
	}
	
	printf("%d\n", ans);

	return 0;
}

 

**** 주의할 점

문자로 표현된 숫자를 로 사용해야 하므로 숫자 표현 문자값에서 ‘0’빼준다.
    ex) ‘1’ – ‘0’ = 1
<string.h> 사용 가능할 경우 문자열 길이는 strlen(배열)을 사용!
 
 
 
 
<Reference>
- http://jungol.co.kr/theme/jungol/status.php?fcode=1620

 

반응형

'Data science > 알고리즘 학습' 카테고리의 다른 글

c++ 자료형 정리  (0) 2022.02.28
SWEA 1251 : 하나로[D4] (c++)_(priority_queue)  (0) 2022.02.23
그래프 알고리즘  (0) 2022.02.22
SWEA 1251 : 하나로[D4] (c++)  (0) 2022.02.13
정올 1816 : 외양간 (c++)  (0) 2022.02.11