이 글은 Do it! 자료구조와 함께 배우는 알고리즘 입문 책에 대한 풀이이다.

연습문제

1. 사람 수를 난수로 생성하도록 2-5를 수정한 프로그램 작성

import java.util.Random;
import java.util.Scanner;

class MaxOfArrayRand{
	static int maxOf(int[] a){
		...//배열의 최댓값을 구하는 함수
	}
	public static void main(String[] args){
		Random rand = new Random();
		Scanner scan = new Scanner(System.in);

		System.out.println("키의 최댓값을 구합니다.");
		System.out.print("사람 수: ");
		
		int[] height = new int[rand.nextInt(10)];

		System.out.println("키 값은 아래와 같습니다.");
		for(int i = 0; i < height.length; i++){
			height[i] = 100 + rand.nextInt(90);
			System.out.println("height[" + i + "]: " + height[i]);
		}
		System.out.println("최댓값은 " + maxOf(height) + "입니다.");
	}
}

2. 배열 요소를 역순으로 정렬하는 과정을 모두 나타내는 프로그램

class ReverseArrayProcess{
	static void swap(int[] a, int idx1, int idx2){
		...//배열에서 idx1과 idx2자리를 바꿔주는 함수
	}

	static void reverse(int[] a){
		for(int i = 0; i < a.length/2; i++){
			System.out.println("a["+ i + "]와 a[" + (a.length - 1 - i) + "]를 교환합니다.");
			swap(a, i, a.length - i - 1);
			for(int j = 0; j < a.length; j++){
				System.out.print(a[j]+" ");
			}
			System.out.println();
		}
	}
}

3. 배열 a의 모든 요소의 합계를 구하여 반환하는 메서드

static int sumOf(int[] a){
	int sum = 0;

	for(int i = 0; i < a.length; i++){
		sum += a[i];
	}

	return sum;
}

4. 배열 b의 모든 요소를 배열 a에 복사하는 메서드

static void copy(int[] a, int[] b){
	for(int i = 0; i < b.length; i++){
		if (i > a.length - 1) break;
		a[i] = b[i];
	}
}

5. 배열 b의 모든 요소를 배열 a에 역순으로 복사하는 메서드

static void rcopy(int[] a, int[] b){
	for(int i = b.length - 1; i >= 0; i--){
		if(b.length - 1 - i > a.length - 1) break;
		b[i] = a[b.length - 1 - i];
	}
}

6. 배열의 앞쪽에 아랫자리가 아닌 윗자리를 넣는 메서드

static int cardConv(int x, int r, char[] d){
	int digits = 0;
	String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

	do{
		d[digits++] = dchar.charAt(x % r);
		x /= r;
	}while(x != 0);

	for(int i = 0; i < digits/2; i++){
		char temp = d[i];
		d[i] = d[digits - 1 - i];
		d[digits - 1 - i] = temp;
	}

	return digits;
}

설마 이렇게 푸는 건 아니겠지… 하면서 이렇게 풀었는데 답이 맞았다.. 알고리즘은 생각보다 복잡한게 아니다. 쉽게 생각하자ㅋㅋㅋㅋㅋㅋㅋㅋ

7. 기수 변환 과정을 자세히 나타내는 프로그램

static int cardConvProc(int x, int r, char[] d){
	int digits = 0;
	String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

	System.out.printf(r + "|%3d\n", x);
	System.out.printf("+----\n");
	do{
		d[digits++] = dchar.charAt(x % r);
		if(x/r == 0)
			System.out.printf("  %3d … %d\n", x/r, x%r);
		else {
			System.out.printf(r + "|%3d … %d\n", x/r, x%r);
			System.out.printf("+----\n");
		}
		x /= r;
	}while(x != 0);

	return digits;
}

8. dayOfYear 메서드를 while문을 사용해 구현하기

static int isLeap(int year){
	...//윤년이면 1, 평년이면 0 반환
}
static int[][] mdays = {
	{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

static int dayOfYear(int year, int month, int day){
	while(--month != 0){
		day += mdays[isLeap(year)][month - 1];
	}
	return day;
}

9. y년 m월 d일의 그 해 남은 일 수를 구하는 메서드

static int isLeap(int year){
	...//윤년이면 1, 평년이면 0 반환
}
static int[][] mdays = {
	{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

static int leftDayOfYear(int year, int month, int day){
	while(--month != 0){
		day += mdays[isLeap(year)][month - 1];
	}
	return 365 - day + isLeap(year);
}