[algorithm] 백준 13300번 방 배정

2026. 1. 10. 14:29·algorithm/배열
반응형

 

이 문제는 내 기준에선 꽤나 어려웠다

문제 구조 자체는 쉬워보이나

내부적인 로직을 짤때나 계산 과정이 마냥 쉽지만은 않아 어려움을 겪었다

 

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n,k;
    int a,b;
    int man = 0;
    int woman = 0;
    int room = 0;

    vector<int> vec1;
    vector<int> vec2;
    vector<int> vec3;
    vector<int> vec4;
    vector<int> vec5;
    vector<int> vec6;
    
    cin >> n >> k;
    for (int tmp=0; tmp<n; tmp++)
        {
            cin >> a >> b;
            if(b == 1) vec1.push_back(a);
            if(b == 2) vec2.push_back(a);
            if(b == 3) vec3.push_back(a);
            if(b == 4) vec4.push_back(a);
            if(b == 5) vec5.push_back(a);
            if(b == 6) vec6.push_back(a);           
        }
    
    for (int tmp : vec1)
        {
            if (tmp == 1) man++;
            if (tmp == 0) woman++;
        }
    room += ((man/k) + (man%k));
    room += ((woman/k) + (woman%k));

    man = 0;
    woman= 0;

    for (int tmp : vec2)
        {
            if (tmp == 1) man++;
            if (tmp == 0) woman++;
        }
    room += ((man/k) + (man%k));
    room += ((woman/k) + (woman%k));

    man = 0;
    woman= 0;

    for (int tmp : vec3)
        {
            if (tmp == 1) man++;
            if (tmp == 0) woman++;
        }
    room += ((man/k) + (man%k));
    room += ((woman/k) + (woman%k));

    man = 0;
    woman= 0;

    for (int tmp : vec4)
        {
            if (tmp == 1) man++;
            if (tmp == 0) woman++;
        }
    room += ((man/k) + (man%k));
    room += ((woman/k) + (woman%k));

    man = 0;
    woman= 0;

    for (int tmp : vec5)
        {
            if (tmp == 1) man++;
            if (tmp == 0) woman++;
        }
    room += ((man/k) + (man%k));
    room += ((woman/k) + (woman%k));

    man = 0;
    woman= 0;

    for (int tmp : vec6)
        {
            if (tmp == 1) man++;
            if (tmp == 0) woman++;
        }
    room += ((man/k) + (man%k));
    room += ((woman/k) + (woman%k));
    
    cout << room;
    return 0;
}

 

처음에는 학년 별로 배열을 나눠서

각 배열마다 방 개수를 구해 더해주는 방식으로 풀었다

 

로직을 짜다가 머리가 안돌아가서

테스트케이스만 보고 짠 직관적인 풀이였다(뇌 빼고푼)

 

결론적으론 room을 구하는 계산식도 예외가 존재해서

(k값이 원소값보다 작은 경우 틀린 값 나옴 ex) k=3, 원소값=2)

2점만 획득했다

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n,k;
    int a,b; // a : 성별, b : 학년

    int room = 0;

    int arr[7][2]; // 학년이 6까지 표시돼야하므로 세로줄 7까지 배열잡기
    cin >> n >> k;
    for (int tmp=0; tmp<n; tmp++)
        {
            cin >> a >> b;
            arr[b][a]++;
        }

    for (int tmp=1; tmp<7; tmp++)
        {
          for (int tmp1=0; tmp1<2; tmp1++)
            {
                room += ((arr[tmp][tmp1]/k) + (arr[tmp][tmp1]%k));
            }
        }
    cout << room;
    return 0;
}

 

2차원 풀이로 해결해야 한다는 힌트를 얻고

풀어봤는데 2점도 아니고 그냥 틀렸다는 결과를 받았다

 

우선 아직도 계산식이 잘못된 줄 모르고 있었고

배열을 선언했지만 초기화를 시켜주지 않은 기본적인 실수를 해서 틀린 것이였다

 

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n,k;
    int a,b; // a : 성별, b : 학년

    int room = 0;

    int arr[7][2] = {}; // 학년이 6까지 표시돼야하므로 세로줄 7까지 배열잡기
    cin >> n >> k;
    for (int tmp=0; tmp<n; tmp++)
        {
            cin >> a >> b;
            arr[b][a]++;
        }

    for (int tmp=1; tmp<7; tmp++)
        {
          for (int tmp1=0; tmp1<2; tmp1++)
            {
                if(k>arr[tmp][tmp1] && arr[tmp][tmp1] != 0) room++;
                else room += ((arr[tmp][tmp1]/k) + (arr[tmp][tmp1]%k));
            }
        }

    cout << room;
    return 0;
}

 

이번엔 위에서 언급했던 예외 케이스가 생각나서 따로 처리해줬는데

또 2점을 받게됐다

결국 계산식이 틀린 것이라고 확신하게됐다

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n,k;
    int a,b; // a : 성별, b : 학년

    int room = 0;

    int arr[7][2] = {}; // 학년이 6까지 표시돼야하므로 세로줄 7까지 배열잡기
    cin >> n >> k;
    for (int tmp=0; tmp<n; tmp++)
        {
            cin >> a >> b;
            arr[b][a]++;
        }

    for (int tmp=1; tmp<7; tmp++)
        {
          for (int tmp1=0; tmp1<2; tmp1++)
            {
                if (arr[tmp][tmp1] == 0) continue;
                else if (k>=arr[tmp][tmp1]) room++;
                else
                {
                  while(arr[tmp][tmp1] != 0)
                    {
                        if (k>=arr[tmp][tmp1])
                        {
                            room++;
                            break;
                        }
                        else
                        {
                            arr[tmp][tmp1] -= k;
                            room++;
                        }
                    }
                }
            }
        }

    cout << room;
    return 0;
}

 

최종 정답 코드다

원소값이 0일때 방 수를 카운팅하는 것을 방지했고

원소값이 k보다 클 때

원소값을 k보다 작아질 때까지 k값에 빼주면서 room을 카운트하는 방식이다

 

간단해 보이지만 내부적으로 생각할게 많아 꽤나 복잡하게 느껴졌던 문제였다

반응형

'algorithm > 배열' 카테고리의 다른 글

[algorithm] 백준 1919번 애너그램 만들기  (0) 2026.01.10
[algorithm] 백준 11328번 Strfry  (0) 2026.01.10
[algorithm] 백준 1475번 방 번호  (0) 2026.01.10
[algorithm] 백준 10807번 개수 세기  (0) 2026.01.10
[algorithm] 백준 2577번 숫자의 개수  (0) 2026.01.10
'algorithm/배열' 카테고리의 다른 글
  • [algorithm] 백준 1919번 애너그램 만들기
  • [algorithm] 백준 11328번 Strfry
  • [algorithm] 백준 1475번 방 번호
  • [algorithm] 백준 10807번 개수 세기
20puddle
20puddle
20puddle 님의 블로그 입니다.
  • 20puddle
    20puddle 님의 블로그
    20puddle
  • 전체
    오늘
    어제
    • 분류 전체보기 (100)
      • Spring boot (5)
      • git & github (5)
      • algorithm (47)
        • theory (3)
        • 배열 (7)
        • 연결 리스트 (3)
        • 스택 (5)
        • 큐 (3)
        • 덱 (2)
        • 기초 코드 (19)
        • BFS (5)
      • AI (43)
        • Machine Learning (35)
        • Deep Learning (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    주성분변환
    머신러닝
    list
    백준
    AI
    오프라인 학습
    git
    딥러닝
    Java
    github
    인공지능
    연결리스트
    Aimers
    게시판
    DL
    그레디언트 클리핑
    Spring Boot
    홀드아웃 검증
    ML
    알고리즘
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
20puddle
[algorithm] 백준 13300번 방 배정
상단으로

티스토리툴바