• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [프로그래머스] 최소직사각형(C++)
    2024년 01월 17일
    • 유니얼
    • 작성자
    • 2024.01.17.:16
    728x90

    안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "최소직사각형" 문제를 해결하는 방법에 대해 설명하려고 합니다. 문제는 명함 지갑을 만드는 회사에서 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작고 휴대하기 편한 지갑을 만드는 것에 관한 것입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.

    문제링크 : 

    https://school.programmers.co.kr/learn/courses/30/lessons/86491

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    Question_1
    Question_2

    문제 개요

    이 문제는 명함 지갑을 만드는 회사에서 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작고 휴대하기 편한 지갑을 만드는 것에 관한 것입니다. 문제에서는 명함의 가로 길이와 세로 길이가 2차원 배열 형태로 주어지며, 이 명함들을 모두 수납할 수 있는 가장 작은 지갑의 크기를 구하는 것이 목표입니다.

    문제 해결 전략

    이 문제의 핵심은 각 명함을 회전시켜 가로와 세로 길이를 최대한 효율적으로 사용하는 것입니다. 명함은 회전시킬 수 있으므로, 각 명함의 긴 쪽을 가로로, 짧은 쪽을 세로로 고려하여 가장 긴 가로 길이와 세로 길이를 찾아야 합니다.

    구현 단계:

    1. 명함의 회전: 각 명함에 대해 긴 쪽을 가로 길이로, 짧은 쪽을 세로 길이로 설정합니다.
    2. 최대 길이의 계산: 모든 명함 중에서 가장 긴 가로 길이와 가장 긴 세로 길이를 찾습니다.
    3. 지갑의 크기 계산: 가장 긴 가로 길이와 세로 길이를 곱하여 지갑의 크기를 계산합니다.

    코드 구현

    #include <string>
    #include <vector>
    #include <bits/stdc++.h>
    using namespace std;
    
    // sizes 배열에 담긴 명함의 크기를 기반으로 최소 직사각형의 크기를 반환하는 함수
    int solution(vector<vector<int>> sizes) {
        int answer = 0; // 최종 결과를 저장할 변수
        int max_x = 0; // 가장 긴 가로 길이를 저장할 변수
        int max_y = 0; // 가장 긴 세로 길이를 저장할 변수
        vector<pair<int,int>> table; // 가로와 세로 길이를 저장할 pair 형식의 벡터
    
        // sizes 벡터를 순회하면서 가로와 세로 길이를 비교하여 긴 쪽을 가로로 설정
        for(int i = 0; i < sizes.size(); i++){
            if(sizes[i][0] > sizes[i][1]){
                table.push_back({sizes[i][0], sizes[i][1]}); // 가로가 세로보다 길 경우
            }
            else{
                table.push_back({sizes[i][1], sizes[i][0]}); // 세로가 가로보다 길 경우
            }
        }
    
        // table 벡터를 순회하면서 가장 긴 가로와 세로 길이를 찾음
        for(auto it : table){
            if(it.first > max_x){
                max_x = it.first; // 가장 긴 가로 길이 업데이트
            }
            if(it.second > max_y){
                max_y = it.second; // 가장 긴 세로 길이 업데이트
            }
            // 현재까지 찾은 가장 긴 가로와 세로 길이 출력 (디버깅용)
            cout << " Max X : " << max_x << " Max Y : " << max_y << "\n";
        }
    
        answer = max_y * max_x; // 최종 지갑의 크기 계산
        return answer; // 계산된 크기 반환
    }

    코드 설명

    • 각 명함의 가로와 세로 길이를 비교하여, 긴 쪽을 가로(width), 짧은 쪽을 세로(height)로 설정합니다.
    • 모든 명함을 순회하면서, 지금까지 발견된 가장 긴 가로와 세로 길이를 업데이트합니다.
    • 최종적으로 가장 긴 가로와 세로 길이의 곱을 반환하여, 지갑의 최소 크기를 계산합니다.

    결론

    이 문제의 해결은 각 명함을 효율적으로 회전시켜 최대 길이를 계산하는 것에 있습니다. 이 접근 방식을 통해, 모든 명함을 수납할 수 있는 최소 크기의 지갑을 만들 수 있습니다. 문제의 핵심은 명함의 회전 가능성을 인식하고, 그에 따라 최대 길이를 동적으로 계산하는 것입니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바