다희의 코딩 성장일기

[JUNGOL] 정올 1880. 암호풀기(Message Decowding)_자바 JAVA 본문

Algorithm/정올

[JUNGOL] 정올 1880. 암호풀기(Message Decowding)_자바 JAVA

ilmiodiario 2020. 12. 27. 14:59

 

[ 문제 ]  정올 1880. 암호풀기(Message Decowding)

 

 

문제 링크jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1153&sca=2050

 

JUNGOL

 

www.jungol.co.kr

 

 


 

[ 입출력 ]


 

[ 풀이 ]

 

< 접근 방법 및 풀이 >

  • 처음에 문제보고 무슨 소리지? 하고 이해하는데 시간이 조금 걸렸다.
  • 입력예시를 잘 보면 이해하기 쉽다. 첫 줄 입력에는 복호화키 26개가 소문자로 주어진다.
  • 예를들어, 입력 예시처럼 eydbkmiqug ... 이런식으로 입력이 들어오면  a,b,c,d... 를 순서대로 복호화 키 문자로 대치하면 된다.
  • [ arr 배열 ]
o 1 2 3 4 5 6 7 8 9
e y d b k m i q u g
a b c d e f g h i j
  • 다음 줄에는 암호화된 문자가 최대 80개 입력된다. 
  • 예를들어, abc를 입력하면  복호화키 eyd로 해석이 된다. 
  • 따라서, 알파벳은 총 26개고, 복호화키 26개를 알파벳순으로 매칭시켜서 암호화를 풀어내면 된다.
  • 1. 첫줄에 입력받은 복호화키를 String 한줄로 입력받아 toCharArray() 메서드를 통해 char 배열로 바꾼다. arr배열에 저장.
  • 2. 두번째 줄에 입력받은 암호화된 문장은 마찬가지로 msg[] 배열에 저장. 
  •  원문을 복호화키로 해석해 출력하기. 공백은 공백그대로, 소문자는 소문자, 대문자는 대문자로 복호화해서 출력.
  • 아스키코드로 소문자 a는 97이므로, 입력받은 암호화 문장에서 97을 뺀 값을 배열의 index처럼 사용함.
  • ex) b를 입력했을 경우 b의 아스키코드값 98 - 97 = 1이며, arr[1] = y. 이런식으로 원문 해석해서 출력함.
  • 마찬가지로 대문자 B는 소문자 b에서 32 차이가 나므로, 대문자로 입력이 들어오면 32를 더해 소문자로 바꿔서 복호화된 값을 구해준 뒤 다시 32를 빼 해당문자의 대문자로 변환하면 된다.
  • 자세한건 코드 주석 참고.

 

< 주의할 점 >

  • 암호화된 문장의 대문자도 해석해서 소문자가 아닌 대문자로 출력해야하는 부분을 주의하기!

 


 

JAVA코드

 

package 문자열;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 암호풀기_1880 {

	public static void main(String[] args) throws IOException {
	
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		
		//복호화 키 26개 소문자 입력.
		char arr[] = in.readLine().toCharArray();
		
		//암호화된 문장 입력받아 배열로 바꿈.
		char msg[] = in.readLine().toCharArray();
		
		//원문 출력
		for (int i = 0; i < msg.length; i++) {
			
			//공백이면 그대로 출력
			if(msg[i] == ' ') {
				System.out.print(msg[i]);
				continue;
			} 
			
		    //대문자라면
			if(msg[i] < 97) {
				msg[i] += 32; //소문자로 바꾸고
				System.out.print((char)(arr[msg[i] - 97] - 32));
				continue;
			}
			
			//그냥 소문자일 경우
			System.out.print(arr[msg[i] - 97]);
			
			
		}
	}
}

 

REVIEW

처음에 문제를 보고 뭔말이지 멈칫했는데 천천히 이해해볼 것.

빠르게 보고 이해하려고 하지말자.

Comments