[출처] 자바의 정석 3판 연습문제 Chapter 9

 

정답)

public class Practice {
	
	public static int count (String src, String target) {
		int count = 0;	// 찾은 횟수
		int pos = 0;	// 찾기 시작할 위치
		
		while(true) {
			pos = src.indexOf(target, pos);
			if(pos!=-1) {
				count++;
				pos += target.length();
			} else {
				break;
			}
		}
		return count;
	}
	public static void main(String[] args) {
		System.out.println(count("12345AB12AB345AB","AB"));
		System.out.println(count("12345","AB"));
		
	}

}

풀이)

무한반복문을 이용해서 찾으려는 문자열이 더 이상 발견되지 않을때까지 반복하게 한다.

indexOf 메소드는 원하는 문자열을 찾았을 경우 그 문자열의 시작 index를 반환한다.

찾지 못했을 경우에만 1을 반환한다.

따라서 문자열을 찾았으면 count1 증가시키고, 찾은 문자열의 시작 index에서 문자열의 길이만큼 더해줘서, 다음 탐색부터는 찾은 문자열 다음부터 탐색을 할 수 있도록 한다.

 

target이 더 이상 발견되지 않는 경우에는 1을 반환해서 무한반복문을 종료하고

count값을 반환한다.

정답)

public class Practice {
	public static String fillZero(String src, int length) {
		if (src==null || src.length() == length) {
			return src;
		} else if (length<=0) {
			return "";
		} else if (src.length() > length) {
			return src.substring(0, length);
		}
		
		char[] zero = new char[length];
		
		for (int i=0; i<zero.length; i++) {
			zero[i]='0';
		}
		System.arraycopy(src.toCharArray(),0,zero,length-src.length(),src.length());
		return new String(zero);
	}
	
	public static void main(String[] args) {
		String src = "12345";
		System.out.println(fillZero(src,10));
		System.out.println(fillZero(src,-1));
		System.out.println(fillZero(src,3));
		
	}

}

코멘트)

 

System.arraycopy(src.toCharArray(), 0, zero, length-src.length(), src.length());

 

이 코드를 작성하는 방법을 몰라서 풀지 못했던 문제이다

 

매개변수에 차례대로

(복사할 원본 소스, 복사를 시작할 index, 복사해서 담을 대상, 담을 대상의 시작 index, 복사할 데이터 갯수)

이렇게 입력하면 된다.

 

src에서 문자배열을 뽑아내서, zero라는 배열에 복사하는 코드이다.

 

 

 

정답)

public class Practice {
	static String delChar(String src, String delCh) {
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<src.length(); i++) {
			char ch = src.charAt(i);
			if(delCh.indexOf(ch)==-1) {
				sb.append(ch);
			}
		}
		return new String(sb);
	}
	
	public static void main(String[] args) {
		System.out.println("(1!2@3^4~5)"+" -> " + delChar("(1!2@3^4~5)","~!@#$%^&*()"));
		System.out.println("(1 2 3 4\t5)"+" -> " + delChar("(1 2 3 4\t5)"," \t"));

	}

}

 

풀이)

먼저 제거하지 않을 문자를 추가해주기 위한 StringBuffer 인스턴스 sb를 만든다.

(StringBufferString보다 내용변경에 더 유용하기 때문이다)

 

반복문을 이용해서 변환할 문자열인 src에 제거할 문자가 포함되어 있는지 확인해야 한다.

 

src의 각 index에 해당하는 문자를 ch에 저장하여 delCh(제거할 문자들로 구성된 문자열)에 해당 문자가 포함되어 있는지 확인한다.

=> if(delCh.indexOf(ch)==-1)

 

-1을 반환한다면 제거할 문자가 아니라는 의미이므로 sb에 해당 문자를 추가해준다.

=> sb.append(ch);

 

반복문을 다 돌면 src에 대한 검사가 끝나게 된다.

검사가 다 끝나고 sbString으로 변환해서 반환하면 된다.

 

 

정답)

public class Practice {
	static String format(String str, int length, int alignment) {
		if (length < str.length()) {
			return str.substring(0, length);
		}
		
		char[] chArr = new char[length];
		for (int i=0; i<chArr.length; i++) {
			chArr[i] = ' ';
		}
		
		char[] strArr = str.toCharArray();
		
		if (alignment == 0) {
			System.arraycopy(strArr, 0, chArr, 0, strArr.length);
		} else if (alignment == 1) {
			System.arraycopy(strArr, 0, chArr, (chArr.length-strArr.length)/2, strArr.length);
		} else {
			System.arraycopy(strArr, 0, chArr, chArr.length-strArr.length, strArr.length);
		}
		
		return new String(chArr);
	}
	
	public static void main(String[] args) {
		String str = "가나다";
		System.out.println(format(str,7,0)); // 왼쪽 정렬
		System.out.println(format(str,7,1)); // 가운데 정렬
		System.out.println(format(str,7,2)); // 오른쪽 정렬`
		
	}
	

}

 

풀이)

length가 문자열 길이보다 짧을 경우엔 substring 메소드로 문자열을 length만큼 잘라서 반환하고,

length가 문자열 길이보다 긴 경우엔 length만큼 공백으로 채운 배열에 str을 직접 채워넣으면 되는 문제이다.

 

가운데정렬을 어떻게 정의할 것인지 아이디어가 생각이 안 났었음.

 

가운데정렬을 한다는 것은 공백의 숫자가 좌우로 반반 나눠지게 되므로

공백의 개수를 반으로 나눈 값의 index부터 문자열을 채워넣으면 된다.

(chArr.length-strArr.length)/2

이렇게 하면 문자열을 기준으로 좌우에 공백이 반반씩 들어가게 된다.

 


[출처] 자바의 정석 3판 연습문제 Chapter 9

 

+ Recent posts