본문 바로가기
프로그래밍/CodeUp

CodeUp[Q_2002] : 비밀편지

by 조원일 2020. 2. 4.
728x90

1. 문제

https://codeup.kr/problem.php?id=2002

 

비밀편지

셀던과 레오나드는 암호화화여 문자를 주고 받았다. 암호화하는 방법은 숫자 S 만큼 알파벳을 이동하는 대치 문자를 이용하였다. (알파벳은 대문자만 사용) 여기서 S를 구하는 방법은 S = 3P + K 이다. K는 입력으로 주어지고, P는 문자열의 각 자릿수값이다. 예를 들어, K=3이고, ZOOM이라는 문자를 암호화한다면, S = 3*1 + 3 = 6 , Z ==> F S = 3*2 + 3 = 9 , O ==> X S = 3*3 + 3 = 12 , O ==

codeup.kr

[출처 : 코드업(https://codeup.kr/)]

이번 문제는 입력받은 문자를 아스키코드를 이용하여 S = 3*P+K만큼 빼주고난 뒤에 다시 문자로 변경해주는 문제입니다.

이문제는 A - 1 => Z인 부분까지 계산을 해주어야 됩니다.

 

 

2. 해답

#include <stdio.h>

void decode(int k, int p, char c) {
	int n = 0;

	n = (int)c - 65 - (3 * p + k) + (26 * 3);
	/*
	A == 0을 기준
	(3 * p + k)만큼 빼기
	모든자리의 n을 양수로 만들어야되는 최소의 S값을 더해줌
	최소 S = 3 * 20(20글자) + 9(최대9) = 69
	알파벳은 26개이므로 69보다 크지만 가장 작은 값 (26 * 3)을 더해줍니다.
	*/
	n %= 26;	// 26으로 나눈 나머지
	n += 65;	// 65를 더해 다시 아스키코드값상의 알파벳으로 변경

	printf("%c", (char)n);
}

int main() {
	int k;
	char str[21];

	scanf("%d", &k);
	scanf("%s", str);

	for (int i = 0; i < strlen(str); i++) {
		decode(k, i + 1, str[i]);
	}

	return 0;
}

'프로그래밍 > CodeUp' 카테고리의 다른 글

CodeUp[Q_2006] : 앞으로 뒤로  (0) 2020.02.08
CodeUp[Q_2005] : 잉여계  (0) 2020.02.05
CodeUp[Q_2004] : 체크보드 출력  (0) 2020.02.05
CodeUp[Q_2003] : 아이콘 확대  (0) 2020.02.05
CodeUp[Q_2001] : 최소대금  (0) 2020.02.04