개발세발
[Java/자바][백준] 2775번: 부녀회장이 될테야 본문
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차원 배열은 미처 생각을 못했다.
아는게 많으면 좀 더 쉽게 풀리는게 많네 를 새삼스럽게 다시 느꼈다.
이제 다시 새로운 방법을 공부해 나가야되는 시점이구나 싶다. 소소한 레벨업을 다시 해보자.
'코딩공부 > Java' 카테고리의 다른 글
[Java/자바] 가비지 컬렉션(Garbage Collection) (정리중) (0) | 2022.02.20 |
---|---|
[Java/자바] 자바 API와 UI (1) | 2022.02.17 |
[Java/자바] Collections Framework (0) | 2022.02.08 |
[Java/자바] array (0) | 2022.02.08 |
[Java/자바] 이클립스 클래스 안 열릴때(오류), JDK경로 수정 방법 Class File Editor java source not found (0) | 2022.01.27 |