본문 바로가기
C | C++/Softeer 문제풀이

Softeer [HSAT 3회 정기 코딩 인증평가 기출] 플레이페어 암호 C/C++ (level 3)

by zyeon 2023. 8. 5.

https://softeer.ai/practice/info.do?idx=1&eid=804&sw_prbl_sbms_sn=236877 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

 

<cpp 문제풀이>

 

#include<iostream>
#include<string>
#include<map>
using namespace std;

int main(int argc, char** argv)
{
	int arr[26] = { 0, };
	char arr2[26]={0,};
	int count = 0;
	map<char, int>m;
	string message, key;
	string answer;
	cin >> message >> key;

	for (int i = 0; i < key.length(); i++) {
		int n = key[i] - 'A';
		m.insert({ key[i],count });
		if (arr[n] == 0)
			count++;
		arr[n] = 1;
	}


	for (int i = 0; i < 26; i++) {

		if (i == 9) continue;
		if (arr[i] == 0) {
			m.insert({ 'A' + i,count });

			count++;
		}
	}


	for (int i = 0; i < message.length(); i += 2) {
		if (i == message.length() - 1) {
			answer += message[i];
			answer += 'X';
		}
		else {
			if (message[i] == message[i + 1]) {
				if (message[i] == 'X') {
					answer += message[i];
					answer += 'Q';
				}
				else {
					answer += message[i];
					answer += +'X';
				}
				i -= 1;
			}
			else {
				answer += message[i];
				answer += message[i + 1];
			}

		}
	}

	for (auto iter = m.begin(); iter != m.end(); iter++)
	{

		arr2[iter->second] = iter->first;
	
	}

	for (int i = 0; i < answer.length(); i += 2) {
		char a;
		if (m[answer[i]] / 5 == m[answer[i + 1]] / 5) {

			if(m[answer[i]] / 5== (m[answer[i]] + 1)/5)
				answer[i] = arr2[m[answer[i]] + 1];
			else		
				answer[i] = arr2[m[answer[i]] -4];

			if (m[answer[i+1]] / 5 == (m[answer[i+1]] + 1) / 5)
				answer[i+1] = arr2[m[answer[i+1]] + 1];
			else
				answer[i+1] = arr2[m[answer[i+1]] -4];

		}
		else if (m[answer[i]] % 5 == m[answer[i + 1]] % 5) {
			answer[i]=arr2[(m[answer[i]]+5)%25];
			answer[i+1] = arr2[(m[answer[i+1]] + 5) % 25];
			
		}
		else {

			int n = m[answer[i + 1]] % 5 - m[answer[i]] % 5;
			
			answer[i + 1] = arr2[m[answer[i + 1]] - n];
			answer[i] = arr2[m[answer[i]] + n];
		}
	}
	cout << answer;
	return 0;
}

map을 이용하여 key값의 중복을 확인하며 번호를 부여하였고, 그 번호를 바탕으로 다시 arr2배열에 알파벳을 재배치 하였습니다.

 

이후 표에서 같은 행에 있을 경우)  /5했을때의 값이 같으므로 arr2에서 다음값으로 변경해주었고, 예외로 다음값이 다음 행에 있을경우는 -4를 해주었습니다.

같은 열에 있을 경우) 나머지 값이 같으므로 %5를 사용하여 계산해주었고

위의 두 경우 모두 해당이 되지 않을 경우) 두 알파벳이 위치한 행에서 몇번째인지의 차를 이용하여 계산해 주었어요!

 

사실 C++기초만 알아도 이해될 정도로 쉬운 문법들만 사용해서 코드를 짰는데, 더 쉽게 짤 수 있는데도 복잡하게 구현한게 아닌가 싶네요 ㅠㅠ 

혹시 더 간단하고 효율적으로 구현하신 분 계시다면 말씀 주시면 감사하겠습니다 ㅎㅎ!

 


다른 의견이나 질문 언제나 환영입니다!!

댓글