[softeer/Java] [인증평가(3차) 기출] 플레이페어 암호

seb Incode·2022년 5월 20일
0
post-thumbnail

문제 설명

https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=804&sw_prbl_sbms_sn=58751

소스코드 (Java)

import java.util.*;
import java.io.*;


public class Main
{
    public static void main(String args[])
    {
        //key table 생성
        Scanner sc = new Scanner(System.in);
        
        String msgString = sc.nextLine();   //entered message String
        String keyString = sc.nextLine();   //entered key String

        char[][] key = new char[5][5];    //create key table
        boolean[] saved = new boolean[26];  //
        ArrayList<String> msg = new ArrayList<>();  //두 글자씩 나눈 메세지들

        int s = 0;  //index for keyString
        int count =0;   //check key table to fill
        //1. 키 길이가 짧은 경우 : 나중에 다른 알파벳으로 채워야함
        //2. 키 길이가 긴 경우 : 중간에 멈출 것
        int index = 0;
        while(index < 25){
            if(s<keyString.length()){
                char temp = keyString.charAt(s++); 
                if(!saved[temp-'A']){   //처음 만난 문자라면
                    if(index < 1){
                        key[index][index%5] = temp;   //저장
                    }
                    else{
                        key[index/5][index%5] = temp;   //저장
                    }
                    index++;
                    saved[temp-'A'] = true;
                }
            }
            else{
                for(int i=0;i<saved.length;i++){
                    if(index >24){
                        break;
                    }
                    if(!saved[i] && i!=9){ //'J' 제외
                        if(index < 1){
                            key[index][index%5] = (char)('A'+i);   //저장
                        }
                        else{
                            key[index/5][index%5] = (char)('A'+i);   //저장
                        }
                        saved[i] = true;
                        index++;
                    }
                }
            }
        }

        int msgLen = msgString.length();
        //메세지 2개씩 나누기
        for(int i=0;i<msgLen;i += 2){
            //마지막 1글자만 남는 경우
            if(i==msgLen-1){
                String m = msgString.substring(i)+"X";
                msg.add(m); //저장
            }
            //나머지 2글자씩인 경우
            else{
                //서로 같은 글자인 경우
                char a1 = msgString.charAt(i);
                char a2 = msgString.charAt(i+1);
                if(a1==a2){
                    //'X' 인 경우
                    if(a1=='X'){
                        String m = a1+"Q";
                        msg.add(m); //저장
                        
                        i -= 1;
                    }
                    else{
                         String m = a1+"X";
                        msg.add(m); //저장
                        
                        i -= 1;
                    }
                }
                //서로 다른 글자인 경우(추가 치환 작업 필요 X)
                else{
                    String m = ""+a1+a2;
                    msg.add(m); //저장
                    
                }
            }
        }
        //System.out.println(msg);

        //3. 암호화
        int x1 = -1;
        int x2 = -1;
        int y1 = -1;
        int y2 = -1;
        String answer ="";  //최종 출력 값
        for(int i=0;i<msg.size();i++){
            char a1 = msg.get(i).charAt(0);
            char a2 = msg.get(i).charAt(1);
            //key table에서 문자 찾기
            for(int z=0;z<5;z++){
                for(int j=0;j<5;j++){
                    if(a1==key[z][j]){
                        x1 = z;
                        y1 = j;
                    }
                    if(a2==key[z][j]){	//else if -> if로 변경
                        x2 = z;
                        y2 = j;
                    }
                    
                }
            }
            //같은 행이면
            if(x1==x2){
                answer += ""+key[x1][(y1+1)%5]+key[x2][(y2+1)%5];
            }
            //같은 열이면
            else if(y1==y2){
                answer += ""+key[(x1+1)%5][y1]+key[(x2+1)%5][y2];
            }
            // 그 외의 경우
            else{
                answer += ""+key[x1][y2]+key[x2][y1];   //서로 열 위치 바꾼 문자로 암호화
            }
        }
        System.out.println(answer);
            
    }
}

결과

지금 velog 사진 업로드가 안돼서... 추후 올릴예정.
왜 나는 else if문을 썼던걸까?ㅋㅋ;;
글자 위치를 key table에서 찾는 과정에서 else if문을 쓴 덕분에
두 글자가 똑같은 경우 두 번째 글자의 인덱스 번호를 찾지 못해서 일부 테스트 케이스가 실패했었다.
조심하자

0개의 댓글