본문 바로가기
혼자 공부하는 것들/알고리즘

[백준] 2775번 java 부녀회장이될테야!!

by applepick 2020. 12. 6.
반응형

문제를 보자.

www.acmicpc.net/problem/2775

 

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);
    }
}

이런식으로 구현해보았다. 접근방식에 따라 시간복잡도가 달라진다는것이 신기했다. 아무튼 끝!

반응형

댓글