JAVA 지정한 char배열 문자열만 거꾸로 출력하기

2016. 9. 11. 11:45공부/JAVA

기계식 키보드로 바꿨더니 타자가 너무 잼나서 계속 포스팅 하게 되네요 ㅋㅋ

이번에 포스팅 할 내용은  for문과 if문을 이용한 지정한 문자열 거꾸로 뒤집어 출력하는 내용입니다.

더 쉽게하는 방법도 많을 거라고 생각됩니다. 하지만 저는 허접이므로 이렇게 하는 방법도 있구나 하고 너그럽게 넘어가 주세요 ^^ ㅎㅎ

전체 코드는 아래와 같다.


public class ArrayUtil {
	public char[] reverseString(char[] s, int start, int end) {
		char[] a = {' '};
		int count = 1;
		for(int i=0; i<s.length; i++){
			
			int result=end-start+i;
			if(i==start){
					for(int j=end-start; j>=0; j--){
						int num = result--;
						System.out.print(s[num]);
						i++;
					}	
			}else{
				System.out.print(s[i]);
			}if(count==1){
				if(end+1==i){
					i--;
					count++;
				}
			}
		}
		return a;
	}
	
	public static void main(String arg[]) {
		ArrayUtil au = new ArrayUtil();
		char[] s = {'J', 'a', 'v', 'a', 'P', 'r', 'o', 'g', 'r', 'a', 'm'};
		System.out.println( au.reverseString(s, 0, 3) );
		System.out.println( au.reverseString(s, 4, 7) );
		System.out.println( au.reverseString(s, 8, 10) );
		System.out.println( au.reverseString(s, 0, 10) );
		
	}
}

1. 우선 public static void main 메소드의 아래를 보면 ArrayUtil을 'au' 로 인스턴스화 시키고 있다.




		char[] s = {'J', 'a', 'v', 'a', 'P', 'r', 'o', 'g', 'r', 'a', 'm'};
		System.out.println( au.reverseString(s, 0, 3) );
		System.out.println( au.reverseString(s, 4, 7) );
		System.out.println( au.reverseString(s, 8, 10) );
		System.out.println( au.reverseString(s, 0, 10) );


2. char배열 타입의  s에 각각 JavaProgram이라는 문자열을 하나씩 집어 넣고 있다.

3. au.reverseString이라는 메소드 즉 ArrayUtil클래스의 reverseString이라는 메소드의 매개변수 값으로 3가지 값을 주고 있다.


	public char[] reverseString(char[] s, int start, int end) {
		char[] a = {' '};
		int count = 1;
		for(int i=0; i<s.length; i++){
			
			int result=end-start+i;
			if(i==start){
					for(int j=end-start; j>=0; j--){
						int num = result--;
						System.out.print(s[num]);
						i++;
					}	
			}else{
				System.out.print(s[i]);
			}if(count==1){
				if(end+1==i){
					i--;
					count++;
				}
			}
		}
		return a;

4. reverseString의 매개변수는 각각 char배열타입, 인트형, 인트형 타입으로 이루어져 있다. 해당 매개변수 값을 다 넣지 않는다면 오류가 발생한다.

   매개변수로 지정했다면 꼭 값을 채워주자.

5. char배열의 a라는 배열을 선언해 주고 공백을 넣어준다. 얘는 리턴값으로 사용할 녀석이다. 리턴 값에 결과 값을 넣어도 되지만 귀찮으므로 이렇게 하자.

6. 카운트라는 변수는 해당 조건을 만족하면 숫자가 증가하고 더이상 실행되지 않는다.



for(int i=0; i<s.length; i++)

7. 위의 포문은 s라는 배열의 길이를 뽑아서 그 길이 만큼 반복하게 하는 코드이다.



			int result=end-start+i;
			if(i==start){
					for(int j=end-start; j>=0; j--){
						int num = result--;
						System.out.print(s[num]);
						i++;
					}	
			}else{
				System.out.print(s[i]);
			}if(count==1){
				if(end+1==i){
					i--;
					count++;
				}
			}
		}
		return a;

8. result값은 끝값을 시작값으로 뺀 후 i를 더 하는 결과 값을 가지고 있다.

  즉 원하는 범위의 문자열을 거꾸로 하기 위해서는 변경되기 원하는 문자열 끝에서 시작하는 값까지를 거꾸로 읽어서 뽑아주면 된다.

9. 거꾸로 뽑는 로직이 끝나고 나면 카운트 값을 비교해서 if문 안으로 들어간다.

10. 위 코드에 있는 for문에서 한번 반복 할 때마다 i값이 1씩 증가하게 했으니 문자열을 거꾸로 뽑는 동안에도 i값은 계속 증가하고 거꾸로 로직이 끝난 후에는 바로 정            상적으로 문자열을 출력해줘야 한다.

11. 하지만 가장 바깥에 있는 for문에도 후위증가연산자가 있기 때문에 for문에 진입순간 i값은 1이 더 증가하게 되고 end값 바로 뒤에 와야할 단어 하나가 생략되게 된다.

12. 그래서 맨 아래 if문에 end+1==i라는 조건문을 걸어 놨다. 해당 조건을 만족하면 i값은 -1이 되며, count값이 1증가하고 조건문을 빠져나오게 된다.

13. 그러면 정상적으로 i값은 end값 바로 다음의 숫자를 가지게 되고 바로 뒤에 있는 문자열이 제대로 출력된다. 그리고 count가 2로 증가한 카운트 변수는 더이상                  count==1이라는 조건문을 통과하지 못한다. 그래서 무한 반복없이 정상적으로 프로그램이 끝나게 된다.



아후 코드를 리뷰하려고 하니 정말 어렵네요.. 오히려 설명을 너무 복잡하게 한게 아닌가 싶기도 하고요.

로직을 이해하시는데 도움이 되었으면 좋겠습니다. ^^

'공부 > JAVA' 카테고리의 다른 글

java예외 처리와 equals 재정의  (0) 2016.09.13
java 소수 구하기 코드  (0) 2016.08.27
JAVA 조건문 (분기)  (1) 2015.11.26
JAVA 공부 Boolean 과 비교 연산자  (1) 2015.11.25