개발세발

[Java/자바][백준] 2775번: 부녀회장이 될테야 본문

코딩공부/Java

[Java/자바][백준] 2775번: 부녀회장이 될테야

뉼👩🏻‍💻 2022. 2. 15. 14:11
728x90
반응형
SMALL

 

https://www.acmicpc.net/problem/2775

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

www.acmicpc.net

 


 

✔️ 주어진 설정을 확실하게 확인하자 

 

🔹 아파트는 0층부터 있다

🔹 제한사항이 1 ≤ k, n ≤ 14 이므로 14층x14호로 된 아파트인것을 알 수 있다. 

🔹 0층의 i호에는 i명이 산다.

🔹 각층에 호수는 1호부터 있다.

   →위의 3~4번째 조건을 통해

     0층은 1호부터 있으며

     1호에 1명, 2호에 2명, 3호에 3명...이 산다는 것을 알 수 있다.  

 

✔️ 계약 조항 이해하기

 a층의 b호에 살려면
자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다

 

    - a층의 b호의 사람 수 = (a-1)층의 1~b호 사람 수의 합 이므로 다음과 같이 정리할 수 있다.

 

 

     x = a+b;

     z = a+b+c+d;

 

 

    - 0층은 0_floor = { 1, 2, 3, 4, 5, .... , 14} 이므로 0층을 기준으로 값을 입력해 봤더니

       다음과 같은 덧셈규칙을 발견할 수 있다.  

 

▪️ 모든 층의 1호는  '1'로 동일하다.   

▪️ a_floor[b] =a_floor[i-1] + (a-1)_floor[i]; 

 

ex) 1층의 3호 = 6일 때,

    6 = (0층의 1호) + (0층의 2호) + (0층의 3호)     //문제에서 주어진 내용 

    ∴ 1층의 2호 = 1층의 1호 + 0층의 2호             //그림을 그려보고 얻은 규칙

   따라서, a층의 i호 = a층의 i-1호 + (a-1)층의 i호 이다.  

 

 

 🔹 n층의 값은 다음과 같다. 

//1층일때 배열값
int[] floor1 = new int[14]; 
for(int i=1; i<14; i++) {
	floor1[0]=1;
	floor1[i]=floor1[i-1]+floor0[i];	
}

//n층일때 배열값
int[] floorn = new int[14]; 
for(int i=1; i<14; i++) {//한 층의 값을 다 리턴
	floorn[0]=1; //1호는 1명으로 고정값
	floorn[i]=floorn[i-1]+floor(n-1)[i];	 
}

 

아랫층 값을 바탕으로 현재층의 값을 구하는 패턴이므로

배열값을 저장해주고, 다시 그 값을 불러내서 덧셈에 활용하는 패턴을 for문을 통해 반복하여 원하는 값을 찾았다. 

 

 

☑️ [풀이]

import java.util.Arrays;
import java.util.Scanner;

public class Q2775{

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
	
		int t = sc.nextInt(); //testcase
		int k=0;              //k층
		int n=0;;			  //n호
		
		for(int j= 1; j<=t; j++) {
        	k = sc.nextInt();
            sc.nextLine();
            n = sc.nextInt();
		
    	    //0층일때의 배열값
    	    int[] floor0 = new int[14];
			for(int i=0 ; i<14; i++) {  //1~14까지의 숫자를 순서대로 입력
    	    	floor0[i] = i+1;		
		    }
		

            //1층일때 배열값
            int[] floor1 = new int[14]; 
            for(int i=1; i<14; i++) {
                floor1[0]=1;
                floor1[i]=floor1[i-1]+floor0[i];	
            }

            int[] floorn = new int[14];
            int[] temp = new int[14]; 

            //k=0 일 때
            if(k==0)       {System.out.println(floor0[n-1]);}

            //k=1 일 때
            else if (k==1) {System.out.println((floor1[n-1]));}

            //k>=2 일때
            if (k>1) {

            //1층 값을 temp배열에 복사
            temp = floor1.clone();         

            //k값 전까지 for문 반복->2층부터 시작하므로 
            for(int h = 1; h<k;h++) {				 
                for(int i=1; i<14; i++) {//한 층의 값을 다 리턴
                    floorn[0]=1; //1호는 1명으로 고정값
                    //원하는 층의 사람수=같은층 옆집까지의 누적수+아래집호수
                    floorn[i]=floorn[i-1]+temp[i];	 
                    }

                //만들어낸 한층 값을 temp에 저장하고 이를 바탕으로 다시 윗층값에 대입
                 temp = floorn.clone();				
            }	
			System.out.println(floorn[n-1]);
            }//층별값 for문
		}//sc for문
	}
}

 

 


 

너무 피곤했는데 저거 보니 잠이 좀 깼다.

규칙은 금방 찾았는데 코드로 구현해 낼줄 몰라서 너무 오래걸렸던 문제..

매번 코드를 못짜서 쉽게 지나갈 문제도 너무 오래걸리고 있다... 기초 잘 다지자 😣😣

 

덧, 

제출하고 다른 풀이 둘러보니 대체로 1.2차원 배열 2.메소드 생성 하여 푼 문제들이 많았다.

메소드는 생각은 했지만 구현을 해내질 못할거 같아서 도전 못해봤었고, 2차원 배열은 미처 생각을 못했다. 

아는게 많으면 좀 더 쉽게 풀리는게 많네 를 새삼스럽게 다시 느꼈다.

이제 다시 새로운 방법을 공부해 나가야되는 시점이구나 싶다. 소소한 레벨업을 다시 해보자. 

 

728x90
반응형