본문 바로가기
JAVA

20190401

by 개폰지밥 2019. 4. 1.
반응형

학교에서 배웠던 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

댓글