
- 정렬 알고리즘
- 탐색 알고리즘
- 탐욕 알고리즘
- Dynamic Programming
새로운 알고리즘을 배울 때마다 해당 알고리즘을 적용할 수 있는 코딩 테스트 문제를 풀었다. 문제 에 적용해야 하는 알고리즘이 지정된 상태에서 풀다보니 많이 어렵지 않다고 느꼈던 것 같다. 하지만 막상 새로운 문제가 주어졌을 때 곧바로 어떤 알고리즘을 적용하는 것이 좋을 지 생각이 나지 않았다. 수업시간 내에 주어진 문제를 해결하는 것도 물론 중요하지만 각각의 알고리즘에 대해서 이해를 하고나서 문제에 적용시켜야 방법이 주어지지 않았을 때도 문제를 해결할 수 있을 것 같다.
이전에 백준 코딩테스트에서 풀었던 문제를 수업시간에 새로운 알고리즘을 적용해서 해결하는 법을 배웠다.
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int count = 0;
/* 3 or 5로 절대 나눠지지 않는 경우 */
if (n == 4 || n == 7) count--;
/* 무게가 5키로 짜리로만 채울 수 있는 경우 */
else if (n % 5 == 0) count = n / 5;
/* 5의 배수 + 1 or 5의 배수 + 3 */
else if (n % 5 == 1 || n % 5 == 3) count = (n / 5) + 1;
/* 5의 배수 + 2 or 5의 배수 + 4 */
else if (n % 5 == 2 || n % 5 == 4) count = (n / 5) + 2;
System.out.println(count);
}
static int count ;
public static int solution(int n) {
count = 0;
while(true) {
/* 5kg 봉지로만 처리 */
if(n % 5 == 0) return n / 5 + count;
else if(n < 0) {
return -1;
} else if(n == 0) { // 3키로 봉지만 해결
return count;
}
/* 5 키로로 나누어 떨어지지 않는다면 3키로 봉지 사용 */
n = n - 3;
count++;
}
}
static final int INF = 9999;
public static int solution(int n) {
/* dp 배열의 인덱스 값이 곧 해당 무게의 봉지 개수가 될 수 있도록 저장한다. */
int[] dp = new int[n + 1];
/* 배열의 모든 값 초기화 */
Arrays.fill(dp, INF); // 값 확인을 위한 초기화
/* n으로 전달되는 숫자가 작으면 인덱스 범위를 벗어날 수 있기 대문에
* 초기값 설정 시 확인하고 반복문은 그 뒤부터 전개한다. */
if(n >= 3) dp[3] = 1;
if(n >= 5) dp[5] = 1;
for(int i = 6; i <= n; i++) {
// 3 이전 또는 5 이전 인덱스 봉지 개수 +1
// INF가 아닌 값으로 처리하기 위해 Math.min()으로 확인
dp[i] = Math.min(dp[i-3], dp[i-5]) + 1;
}
return dp[n] >= INF ? -1 : dp[n];
}
같은 문제에도 다양한 알고리즘을 적용할 수 있다. 실제 코딩 테스트 도중에는 성능 테스트가 불가능하지만 공부할 때 어떤 방식을 적용하는 게 더 높은 성능을 내는지 파악해서 실제 문제에도 적용할 수 있도록 해야 겠다.
코딩 테스트를 통과하려면 다양한 문제를 풀어보면서 알고리즘에 대한 이해도를 높여야 하므로 동기들과 알고리즘 스터디를 진행하기로 했다. 문제 해결에 초점을 맞추기 보다는 이해해서 응용 하는데에 초점을 맞춰서 차근차근 풀어나가야 겠다.
천 리 길도 한 걸음부터