반응형
문제를 보자.
2775번: 부녀회장이 될테야
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다. (1 <= k <= 14, 1 <= n <= 14)
www.acmicpc.net
일단 처음 생각한 것은 일차원 배열에 0번째에 테스트 케이스 값을 넣고 홀수번 차에 k값을 넣고 짝수번 차에 n값을 넣어 풀어보려고 했다.
package test;
import java.util.*;
public class Main {
public static void main(String[] argc) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt(); //전체테스트케이스
int[] array = new int[T*2]; //k값과 n을 배열로 저장
int[] total = new int[T]; //결과값 저장
int p=0;
for(int i=1; i<array.length; i++) { //k값과 n값을 입력받
array[i] = sc.nextInt();
}
for(int i=1; i<array.length; i=i+2) { //홀수는 k값
for(int j=2; j<array.length;j=j+2) { //짝수는 n값
int k = i;
int n = j;
int buffer = 0;
for (int a= 0; a<=k;a++) {
for(int b=0; b<=n;b++) {
buffer +=b;
}
}
total[p]=buffer; //각 케이스문에 값을 토탈배열에 저장
p++;
}
}
System.out.println();
for(int i =0; i<total.length;i++) {
System.out.println(total[i]);
}
}
}
일차원 배열로 접근을 잘못한 것 같다. k값과 n값을 배열에 저장해서 따로 토털이라는 배열에 저장해주려고 했다. 하지만 이 방법은 좋은 방법이지 않았다. 그래서 다시 생각해 보기로 했다. 2차원 배열을 사용해 보기로 했다.
2차원 배열로 접근해본 코드이다.
import java.util.*;
public class Main {
public static void main(String[] argc) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int[][] apt = new int[15][15];
int[] total = new int[T];
for(int i= 0; i<15;i++) {
apt[i][1] = 1;
apt[0][i] = i;
}
for(int i=1; i<15;i++) {
for(int j=2; j<15;j++) {
apt[i][j]= apt[i][j-1]+apt[i-1][j];
}
}
for(int i=0;i<T;i++) {
int k = sc.nextInt();
int n = sc.nextInt();
total[i] = apt[k][n];
}
for(int i=0;i<T;i++) {
System.out.println(total[i]);
}
}
}
이러한식으로 Scanner로 받아서 풀어보니 이번에는 런타임 오류가 떴다. 값은 맞았지만, 디버깅 시간이 너무 오래 걸려서 그런 것 같다. 입출력을 BufferedReader로 바꿔서 실행했다. 나중에 BufferedReader와 Scanner의 차이점을 한 번 정리해보겠다.
이번엔 BufferedReader를 이용해서 풀어보았다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine());
StringBuilder builder = new StringBuilder();
int[][] apt = new int[15][15];
for(int i=0 ; i<15 ; i++)
apt[0][i] = i;
for(int i=1 ; i<15 ; i++)
for(int j=1 ; j<15 ; j++)
apt[i][j] += apt[i][j-1] + apt[i-1][j];
for(int i=0 ; i<T ; i++){
int k = Integer.parseInt(reader.readLine());
int n = Integer.parseInt(reader.readLine());
builder.append(apt[k][n]).append("\n");
}
System.out.println(builder);
}
}
이런식으로 구현해보았다. 접근방식에 따라 시간복잡도가 달라진다는것이 신기했다. 아무튼 끝!
반응형
'혼자 공부하는 것들 > 알고리즘' 카테고리의 다른 글
[프로그래머스][Python] 나누어 떨어지는 숫자 배열 (0) | 2021.02.21 |
---|---|
[백준] 2908번 java 상수 (0) | 2020.12.08 |
백준 Java) 3052번 나머지 문제 (0) | 2020.12.03 |
크러스컬 알고리즘의 구현 및 실험 (0) | 2020.10.13 |
퀵정렬 개선하기 (0) | 2020.10.13 |
댓글