[Do it! 알고리즘] 02-1 배열
이 글은 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);
}