나를 기록하다
article thumbnail
반응형

오늘의 공부는 아래와 같다.

  1. 알고리즘 - 2문제
  2. 객체지향의 사실과 오해 - 1장, 2장 정독
  3. 우아한 테크코스 자기소개서 - 1,4문항 완료 / 2,3문항 작성 중

백준 2775 부녀회장이 될테야

시간 제한메모리 제출 정답 맞힌 사람 정답 비율
0.5 초 (추가 시간 없음) 128 MB 94941 53064 45163 57.067%

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력

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

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

제한

  • 1 ≤ k, n ≤ 14

 

첫 번째 풀이

문제 분석
  •  “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다”
    → DP(Dynamic Programming; 동적 프로그래밍) 사용
  • 1 ≤ k, n ≤ 14 의 범위 제한 존재
  • 범위 제한이 있기에 DP를 사용해야 한다는 것만 알면 문제는 간단하다.

결과

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int testCase = Integer.parseInt(br.readLine()); // 테스트 케이스의 수를 입력받습니다.

        for (int i = 0; i < testCase; i++) {
            int k = Integer.parseInt(br.readLine()); // 층 수 k를 입력받습니다.
            int n = Integer.parseInt(br.readLine()); // 호 수 n을 입력받습니다.

            // reader 메서드를 호출하여 결과를 출력합니다.
            System.out.println(reader(k, n));
        }

        br.close();
    }

    public static int reader(int k, int n) {
        int dp[][] = new int[k + 1][n + 1]; // 동적 프로그래밍을 위한 배열을 생성합니다.

        // 초기화: 0층의 각 호실은 호 수와 동일합니다.
        for (int i = 1; i <= n; i++) {
            dp[0][i] = i;
        }

        // 동적 프로그래밍을 통해 값을 계산합니다.
        for (int i = 1; i <= k; i++) {
            for (int j = 1; j <= n; j++) {
                for (int l = 1; l <= j; l++) {
                    dp[i][j] += dp[i - 1][l]; // 현재 층의 호실 값은 이전 층의 같거나 낮은 호실 값들의 합입니다.
                }
            }
        }

        return dp[k][n]; // 결과값을 반환합니다.
    }
}

 

두 번째 풀이

결과

코드 개선(리팩토링)
  • 위의 코드는 for 문이 3번이나 중첩되는 등 깔끔하지 못한 코드이기에 리팩토링을 실시한다.
  • 매번 출력을 하는 것보다 StringBuilder를 사용하여 한 번에 출력하도록 구현
  • 범위가 정해져 있으므로 반복문에서 k, n을 사용하는 것보다 범위의 최댓값인 14를 넣는 것이 보다 효율적
  • 모든 1호는 1, 0층 i호는 i로 초기화
  • dp[i][j] += dp[i-1][j]로 계속 더해주는 것 보다 dp[i][j] = dp[i][j-1] + dp[i-1][j]로 코드 수정
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static int[][] dp = new int[15][15];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        roomSize(); // 호실 크기를 미리 계산합니다.

        int testCase = Integer.parseInt(br.readLine()); // 테스트 케이스의 수를 입력받습니다.

        for (int i = 0; i < testCase; i++) {
            int k = Integer.parseInt(br.readLine()); // 층 수 k를 입력받습니다.
            int n = Integer.parseInt(br.readLine()); // 호 수 n을 입력받습니다.

            sb.append(dp[k][n]).append('\n'); // 결과를 StringBuilder에 추가합니다.
        }
        br.close();
        System.out.println(sb); // 최종 결과 출력
    }

    // 호실 크기를 계산하는 메서드
    public static void roomSize() {
        // 초기화: 0층의 각 호실은 호 수와 동일합니다.
        for (int i = 1; i <= 14; i++) {
            dp[i][1] = 1;
            dp[0][i] = i;
        }

        // 동적 프로그래밍을 통해 값을 계산합니다.
        for (int i = 1; i <= 14; i++) {
            for (int j = 2; j <= 14; j++) {
                dp[i][j] = dp[i][j - 1] + dp[i - 1][j]; // 현재 층의 호실 값은 이전 층의 같거나 낮은 호실 값들의 합입니다.
            }
        }
    }
}

객체지향의 사실과 오해

객체지향의 사실과 오해

객체지향의 사실과 오해는 총 7장과 2개의 부록으로 구성되어 있으며, 오늘은 1장과 2장을 읽었다.

하루에 2장 ~ 3장 정도씩 읽어 이번주 내에 완독하는 것이 목표이다.

오늘 읽었던 내용을 요약하겠다.

 

객체지향의 목표는 실세계를 모방하는 것이 아니라 고객을 만족시킬 수 있는 신세계를 창조하는 것이다.
- 조영호(저자)

 

객체를 스스로 생각하고 스스로 결정하는 현실 세계의 생명체에 비유하는 것

→상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는데 효과적

 

현실 세계의 사람들이 암묵적인 약속과 명시적인 계약을 기반으로 협력하며 목표를 달성해 나가는 과정이 
메시지를 주고 받으며 공동의 목표를 달성하기 위해 협력하는 객체들의 관계를 섬령하는 데 적합

 

 

역할
  • 손님, 캐시어, 바리스타는 부여받은 역할, 역할에는 책임이 수반
책임
  • 프로그래머에게 훌륭한 프로그램을 개발할 책임 → 역할은 책임을 암시, 책임은 협력에서 각 사람(객체)가 해야할 행동 묘사
협력
  • 요청(request)과 응답(response)로 구성
  • 커피 전문점 예시
    • 요청(request)
      손님 → 캐시어 → 바리스타
    • 응답(response)
      바리스타 → 캐시어 → 손님

 

읽고 바로 정리를 안했더니 내용이 헷갈려서 내일 다시 읽으면서 내용을 추가하겠다.


우아한 테크코스 자기소개서

https://www.woowacourse.io/apply

 

지원하기

🪐 우아한테크코스 2024 입학설명회

www.woowacourse.io

우아한 테크코스의 서류 접수가 곧 시작되기에 자기소개서를 작성해봤다.

학부시절 내내 공기업만을 바라보고 준비를 해서 그런지 특별한 경험이 딱히 없어서 불안하다.

 

군휴학을 제외하고는 휴학없이 복학한 2018년부터 현재까지 쉬지 않고 달려왔는데 자기소개서를 적을 땐 매번 나는 무엇을 했는가에 대한 의문이 남는다.

 

특히 이번 자기소개서는 증빙자료가 중요한데 얼마 전 클라우드 용량이 부족하다는 말에 자료를 정리하면서 삭제를 하여 못 적는 경험들을 제외하고 나니 적을 것이 정말로 몇 개가 없다.

 

과연 내가 우아한 테크코스에 합격할 수 있을까라는 생각이 든다.

수많은 부트캠프 중에서 나에게 가장 가고 싶은 캠프를 꼽으라면 단연코 우테코라고 말할 수 있다.

이유는 다양한데 몇가지만 꼽자면,

  1. 테코톡을 보면서 나도 우아한 테크코스 크루로 합류하여 테코톡 발표를 하면서 지식 공유를 해보고 싶다는 생각을 했다.
  2. 뛰어난 크루원들과 짝 프로그래밍이나 프로젝트 진행을 해보고 싶다.
    (공개되어 있는 프로젝트 결과물을 구경하였는데 퀄리티가 상당히 좋아서 더 그런 것 같다.)
  3. 비전공자이기에 경험해본 적 없는 검증된 교육환경을 경험해보고 싶은 욕구가 크다.

 

위와 같은 이유로 이제까지의 자소서와 다르게 심혈을 기울여서 작성하고 있는데 생각보다 잘 써지지 않는다.

우테코는 프리코스를 제공해주기에 실력이 부족하여 떨어지더라도 프리코스에서 얻을 수 있는 것이 상당히 많을 것이라 기대하고 있기에 후회없이 최선을 다해보려 한다.

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...