학교에서 배웠던 for문은 보통 0에서 시작하고 증가하는 for문만 사용해봤는데, 그 밖에도 다양하게 for문을 사용할 수 있었다.
* 감소하는 for문
- 소스코드
public class Caesar { public static void main(String[] args) { for(int i = 10; i!=0; i--) { System.out.println(i); } } } |
- 결과
10 9 8 7 6 5 4 3 2 1 |
* for문으로 1, 2, 4, 8, 16... 출력
- 소스코드
public class Caesar { public static void main(String[] args) { for (int e = 1; e <= 16; e = e * 2) { System.out.println(e); } } } |
- 결과
1 2 4 8 16 |
* for문으로 8 , 4, 2, 1... 출력
- 소스코드
public class Caesar { public static void main(String[] args) { for (int i = 8; i!=0; i=i/2) { System.out.println(i); } } } |
- 결과
8 4 2 1 |
============================================================================
============================================================================
* 자바 시저 암호 만들기
seulgi를 3칸 평행이동해서 시저암호로 만들기
- 소스코드
public class Caesar { public static void main(String[] args) { // 시저 암호 만들어보세요. // 아스키 코드 // 대문자 소문자, 알파벳 갯수 26개 final int i = 3; char[] ccc = { 's', 'e', 'u', 'l', 'g', 'i' }; for (int b = 0; b < ccc.length; b++) { int sum = ccc[b]; int ddd = sum + i; System.out.print((char) ddd); } } } |
- 결과
vhxojl |
seulgi가 3칸씩 잘 평행이동 된 것을 볼 수 있다.
- 응용
하지만 z를 넣으면 어떻게 될까? z에서 3칸 이동해도 알파벳을 나오게 하고 싶으면 소스코드를 수정해야한다.
수정전에는 이렇게 나온다.
- 소스코드
public class Caesar { public static void main(String[] args) { // 시저 암호 만들어보세요. // 아스키 코드 // 대문자 소문자, 알파벳 갯수 26개 final int i = 3; char[] ccc = { 'z' ,'z','z'}; for (int b = 0; b < ccc.length; b++) { int sum = ccc[b]; int ddd = sum + i; System.out.print((char) ddd); } } } |
- 결과
}}} |
- 응용 -2 zzz를 넣어도 특수문자가 아닌 알파벳이 나오게 하기
알파벳 수가 26개랑 26을 빼주었다.
- 소스코드
private static void test004() { // 시저 암호 만들어보세요. // 아스키 코드 // 대문자 소문자, 알파벳 갯수 26개 int a = 3; int n; String str = "XYZABC"; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); char chh = (char) (ch + a); int chhh = (int) chh; if(chhh>90) { int chhhh = chhh-26; System.out.println((char)chhhh); }else { System.out.println((char)chhh); } } } |
- 결과
A B C D E F |
- 응용 -3 소문자를 넣으면 3칸이 평행이동 되지 않는다.
- 소스코드
private static void test004() { // 시저 암호 만들어보세요. // 아스키 코드 // 대문자 소문자, 알파벳 갯수 26개 int a = 3; int n; String str = "XYZABCabc"; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); char chh = (char) (ch + a); int chhh = (int) chh; if(chhh>90) { int chhhh = chhh-26; System.out.println((char)chhhh); }else { System.out.println((char)chhh); } } } |
- 결과
A B C D E F J K L |
JKL이 아닌 abc -> def가 나오게 하고 싶다.
- 해결
abc를 하면 def가 나오지만 xyz를 입력하면 abc가 아닌 문자가 나온다. 소문자도 위와 같이 고쳐줘야할 것 같다.
- 소스코드
private static void test004() { // 시저 암호 만들어보세요. // 아스키 코드 // 대문자 소문자, 알파벳 갯수 26개 int a = 3; int n; String str = "ABCabcXYZxyz"; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); char chh = (char) (ch + a); int chhh = (int) chh; if (65 <= chhh && chhh <= 93) { if (chhh > 90) { int chhhh = chhh - 26; System.out.println((char) chhhh); } else { System.out.println((char) chhh); } } else if (97 <= chhh && chhh <= 125) { if (chhh > 125) { int chhhh = chhh - 26; System.out.println((char) chhhh); } else { System.out.println((char) chhh); } } } } |
- 결과
D E F d e f A B C { | } |
- 응용 - 4
소문자 xyz도 문자가 아닌 abc 나오게 하기
- 소스코드
private static void test004() { // 시저 암호 만들어보세요. // 아스키 코드 // 대문자 소문자, 알파벳 갯수 26개 int a = 3; int n; String str = "ABCabcWXYZwxyz"; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); char chh = (char) (ch + a); int chhh = (int) chh; if (65 <= chhh && chhh <= 93) { if (chhh > 90) { int chhhh = chhh - 26; System.out.println((char) chhhh); } else { System.out.println((char) chhh); } } else if (97 <= chhh && chhh <= 125) { if (chhh > 122) { int chhhh = chhh - 26; System.out.println((char) chhhh); } else { System.out.println((char) chhh); } } } } |
- 결과
D E F d e f Z A B C z a b c |
그런데 여전히 문제가 존재한다...
시저 암호는 n개의 수를 평행이동해서 암호화하는 것인데 여기서는 평행이동을 3개라고 한정지었지만 나중에는 평행이동을 4개를 할 수도 있고 5개를 할 수 도있는데 그럴 때마다 소스코드를 수정해야 한다.
소스 코드를 수정하지 않아도 시저 암호화를 할 수 있는 소스코드를 고민해봐야 할 것 같다.
============================================================================
============================================================================
'JAVA' 카테고리의 다른 글
Java Class & Object에 관해서 (0) | 2019.04.16 |
---|---|
[JAVA] Caesar cipher Coding 하기 (0) | 2019.04.12 |
190329 (0) | 2019.03.28 |
[JAVA] Scanner, 형변환, 연산자, if문 (0) | 2019.03.28 |
[JAVA] Star Craft 만들기 (0) | 2019.02.22 |
댓글