https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=804&sw_prbl_sbms_sn=58751
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문을 쓴 덕분에
두 글자가 똑같은 경우 두 번째 글자의 인덱스 번호를 찾지 못해서 일부 테스트 케이스가 실패했었다.
조심하자