나를 기록하다
article thumbnail
반응형

오늘은 평소와 같이 오전에 운동을 하고 알고리즘을 풀면서 하루를 시작했다.

오늘 계획한 목표는 알고리즘 1문제 / 객체지향의 사실과 오해 1장 정리 / 자기소개서 보완 / 우아한테크세미나 TDD 리팩토링 듣고 정리였고, 공부한 내용을 차례대로 정리해보겠다.

 

백준 7568 덩치(Java)

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

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

시간 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 128 MB 93178 51602 43607 55.983%

문제

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.

N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.


          이름                    (몸무게, 키)               덩치 등수
A (55, 185) 2
B (58, 183) 2
C (88, 186) 1
D (60, 175) 2
E (46, 155) 5

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

입력

첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.

출력

여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다.

 

문제 분석
  • 문제를 보고 처음에는 Map의 형태로 (Key, Value)를 (몸무게, 키) 이렇게 자료구조를 구현해야 하나라고 생각을 했지만, 그렇게 구현하면 등수를 매기기 어렵고, 형태가 너무 복잡해진다.
  • 따라서 기본적인 형태인 2차원 정수형 배열인 int[][]로 배열을 생성하여 몸무게와 키를 담는 자료구조를 만들었다.
  • 알고리즘은 우선 기본값을 1등으로 한다.
  • 그리고 A와 B를 비교했을 때, A의 키와 몸무게 둘다 B의 키와 몸무게보다 커야만 더 높은 등수를 매기고, 키는 크지만 몸무게는 적은 경우, 몸무게는 더 많이 나가지만 키는 작은 경우에는 같은 등수로 본다.
  • 위의 논리에 따라 키와 몸무게가 둘다 작은 경우만을 선별하여 등수에 1을 더해준다.(등수를 낮춘다)

 

답안

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

public class Main {
    public static void main(String[] args) throws IOException {
        // 입력을 받기 위한 BufferedReader 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 결과를 저장할 StringBuilder 객체 생성
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine()); // 전체 사람 수 입력 받기

        // 각 사람의 몸무게와 키를 저장할 2차원 배열 생성
        int[][] people = new int[N][2];

        // 각 사람의 몸무게와 키 정보 입력 받기
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            people[i][0] = Integer.parseInt(st.nextToken()); // 몸무게 입력 받기
            people[i][1] = Integer.parseInt(st.nextToken()); // 키 입력 받기
        }
        br.close(); // BufferedReader 닫기

        // 각 사람의 등수 계산 및 결과를 StringBuilder에 추가
        for (int i = 0; i < N; i++) {
            int rank = 1;
            for (int j = 0; j < N; j++) {
                if (i == j)
                    continue;
                // 만약 현재 사람(i)보다 몸무게와 키가 더 큰 사람(j)을 찾으면 rank 증가
                if (people[i][0] < people[j][0] && people[i][1] < people[j][1]) {
                    rank++;
                }
            }
            // 결과에 현재 사람의 등수 추가
            sb.append(rank).append(' ');
        }
        // 결과 출력
        System.out.println(sb);
    }
}

알맞은 자료구조만 선택한다면 크게 어려운 문제는 아니기에, 주석을 참고하길 바란다.


객체지향의 사실과 오해 1장. 협력하는 객체들의 공동체

https://prao.tistory.com/entry/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-1%EC%9E%A5-%ED%98%91%EB%A0%A5%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EB%93%A4%EC%9D%98-%EA%B3%B5%EB%8F%99%EC%B2%B4

 

[객체지향의 사실과 오해] 1장. 협력하는 객체들의 공동체

1. 협력하는 객체들의 공동체 객체지향의 시작 객체지향이란, 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임 저자가 말하는 객체지향 객체지향의 목표는 실세계를 모방하는 것이

prao.tistory.com

관련 내용은 위 포스팅에 정리해두었다.

1장에서 기억에 남는 문구는 다음과 같다. 자세한 내용은 포스팅을 참고 바란다.

코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하라.
중요한 것은 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가다.
클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다.
클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라.
객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

자기소개서

어제부터 작성하던 자기소개서를 보완하였다. 자기소개서는 볼 때마다 부족한 점이 보인다.

관련 증빙자료가 있는 경험을 계속해서 찾다가, 떠오른 경험을 몇 가지 추가하였는데 좋게 봐주실지 모르겠다.

저번 기수 백엔드 경쟁률을 보아하니 약 15:1이었다.

공기업을 준비했던 나였기에 100:1, 50:1과 같은 경쟁률에 익숙해져서 공기업이었다면 15:1은 거저먹기라고 생각했을텐데, 나의 전공이 아닌 개발에 있어서 15:1이라는 숫자를 보니 굉장히 막막하다.

어찌됐든 나는 도전할 것이기에 잡념은 최대한 줄이고, 정진한다.

이 도전을 하면서 얻는 경험들은 결국 취업준비생인 나의 최종 목표인 백엔드 개발자로의 취업에 도움을 줄 수 있을 것이다.

어느 정도 자기소개서를 마무리했기에 내일부터는 조금씩 다듬기만 하고 다시 MVC, TDD 개념 공부에 집중하겠다.


TDD, 리팩토링

우아한테크코스 프리코스 과제를 연습하기에 앞서서 많은 사람들이 추천해준자바지기 박재성님의 TDD 리팩토링 세미나를 듣고 정리하는 중이다. 이해를 하면서 정리하고 있기에, 아직 깔끔하게 정리하지 못하여 내일 추가로 업로드를 할 예정이다.

 

Spring을 공부하다가 이전의 기술들이 궁금해서 JSP, Servlet을 공부하였고, 공부한 내용을 바탕으로 미니 프로젝트를 만들었었다.그 이후, 현재까지는 우아한테크코스에 집중하느라 잠깐 개발을 놓고 있다.물론 개발자가 개발을 하는 것도 중요하지만 내 성향상 아무것도 모르면서 바로 개발을 하는 것보다는 모르는 부분이 있다면 개념적으로 공부를 하고 채워나가면서 개발을 하는 것이 잘 맞기에 부족한 부분들을 하나씩 채워나가고 있다.자기소개서와 프리코스 준비로 정신이 없어서 테코톡과 네트워크 공부를 잠깐 놓고 있었는데 빠른 시일 내로 다시 시작하려 한다.우아한테크코스에 떨어지더라도 큰 타격이 없도록 기존의 공부도 놓지 않으면서 함께 준비해보겠다.

반응형
profile

나를 기록하다

@prao

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

profile on loading

Loading...