본문 바로가기

자바 Do,It 알고리즘(끝)

[자바 Do It! 알고리즘]Chapter02 기본 자료구조(기수변환, 소수 구하기, 한 해의 경과일 수 구하기)

안녕하세요, 의창입니다.

이번 알고리즘들은 이해하기 너무 어렵네요 ㅠ.ㅠ

그래도 꾸준히 하다보면 언젠가 늘겠죠..?

사실 지금 정리하면서도 잘 이해안됩니다!

기수 변환 프로그램

☞ digits는 변환한 수의 자릿수를 나타내기 위한 변수

☞ do문 루프본문에서 수행하는 작업

1. 먼저 x를 r로 나눈 나머지를 인덱스로 하는 문자를 배열 d의 요소 d[digits]에 대입하고 digits 값을 증가시킵니다.

2. x를 갈로 나눕니다.

예를 들어, x%r이 11이면 문자 'B'를 d[digits]에 대입하고, 그 다음 digits를 증가시킵니다.

이 작업을 x가 0이 될 때까지 반복합니다.

※ String 클래스 중 기억해야 할 메서드

char charAt(int i) // 인덱스가 i인 곳의 문자를 가져옵니다.

int length() // 문자열의 문자 수를 가져옵니다.

boolean equals(String s) // 문자열 s와 같은가를 조사합니다.

소수를 구하는 알고리즘

☞ 어떤 정수 n은 다음 조건을 만족하면 소수라고 판단할 수 있습니다.

조건 : n의 제곱근 이하의 어떤 소수로도 나누어 떨어지지 않습니다.

☞ 곱셈의 처리 비용은 나눗셈과 같으므로 이 프로그램에서는 counter에 곱셈과 나눗셈 횟수의 합계를 저장합니다.

☞ 안쪽의 for문을 반복할 때마다 counter를 2씩 증가시키는 것은 다음 두 연산의 수행 횟수를 계산하기 위해서입니다.

곱셈 : prime[i] * prime[i]

나눗셈 : n % prime[i]

☞ prime[i] * prime[i] <= n이 성립하지 않느 ㄴ경우, 프로그램 흐름이 안쪽 for 문의 루프 본문으로 들어가지 않으므로 그 곱셈이 수행횟수에 포함되지 않습니다. 그래서 for문 종료 후의 if 본문에서 그 부분을 횟수에 포함시킵니다.

한 해의 경과 일수를 계산하는 프로그램

☞ 일반적으로 m월 d일의 그 해 경과 일수는 다음과 같습니다.

1월, 2월, ..., m-1월의 일 수의 합 + d

☞ 그런데 2월의 일 수는 평년은 28일, 윤년은 29일로 해에 따라 달라집니다. 그래서 배열 mdays에 각 달의 일수를 저장할 수 있습니다.

☞ 지구가 태양 둘레를 한 바퀴 도는 일 수는 정확히 365일이 아닙니다. 그것을 조정하기 위해 4로 나누어떨어지는 해를 윤년으로 하여 1년을 366일로 합니다.하지만 그래도 정확하지 않으므로 100으로 나누어떨어지고 400으로 나누어떨어지지 않는 해는 평년으로 합니다.

☞ 매서드 dayOfYear는 다음과 같은 순서로 그 해의 경과 일 수를 구합니다.

1. days에 d의 값을 그대로 대입합니다.

2. i를 1부터 m-1까지 증가하면서 days에 y년 i월의 일 수를 더합니다.(즉, 1월부터 m-1월까지 일 수를 더합니다.)