C++ 연습!
카펫의 가운데는 노란색, 테두리 1줄은 갈색
갈색과 노란색의 cell 개수만 보고 카펫의 가로, 세로 크기를 알 수 있을까?
아이디어: 노란색의 가로+2 = 갈색 가로, 노란색 세로+2 = 갈색 세로
총 cell 개수 = 노랑+갈색;
brown 가로세로 = 카펫 가로세로임
그러면 brown의 가로세로를 순차적으로 점검하며 possibility를 분석하면 된다
brown 세로 길이 최솟값 = 3
왜냐면 yellow의 최소 세로가 1임. 그리고 위아래로 brown cell이 1개씩 붙으니까 3
brown 세로 길이 최대 = 루트(총 cell 개수)
왜냐면 총 개수를 어떻게 구겨넣든 일단 가로=세로가 되는 지점에서 멈춰야 되니까
(그 이상으로 넘어가면, 그 이전에서 살펴본 것을 가로, 세로 길이만 바꿔서 다시 살펴보는 셈이 된다)
따라서 위 값 범주 사이에서 아래와 같은 조건을 살펴본다
만약 total%h==0인 경우, 세로 값으로 가로 값이 나누어 떨어져 직사각형이 형성 가능한 경우
세로 값을 바탕으로 가로 값을 total/h로 설정해준다
그리고 이 값을 바탕으로 yellow 값이 유효한지 봐줄건데,
brown은 너비가 1인 테두리이기 때문에 yellow에서 좌우 또는 상하 1씩 더해서
각 가로 세로값에서 yellow+2=brown이 된다
따라서, (w-2)*(h-2) 값이 yellow와 같은지 비교하고,
참이면 각 값을 가로-세로 순으로 answer 배열에 push_back한 후 break;
*push_back은 벡터 끝에 새로운 원소를 추가하는 방법이다.
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int total = brown+yellow;
for(int h=3; h<=sqrt(total);h++){
if(total%h==0){
int w = total/h;
if((w-2)*(h-2)==yellow){
answer.push_back(w);
answer.push_back(h);
break;
}
}
}
return answer;
}
번외
이건 그냥 궁금해서 삽질해본건데
결과는 이상한 값이 나와서 완전탐색으로 얌전히 풀었다
(gpt한테 어떻게 가능하게 안될까? 했다가 님아 이문제 이런 식으로 푸는거 아님;;하고 혼남)
ㄴ 이렇게 풀지 마세용
작성 시작: 11.06 11:52
작성 종료: 11.06. 12:31
밥먹으러 가야지!!
오늘 학식 특식이 아직 안끝났을까!?!?!
'개발자 강화 > 코딩 테스트' 카테고리의 다른 글
[백준] 1926_그림 BFS 실1 (Python3) (3) | 2024.11.07 |
---|---|
[프로그래머스] 네트워크-BFS/DFS lv.3 (Python3) (0) | 2024.11.07 |
[프로그래머스] 소수 찾기 - 완전탐색 (C++) (0) | 2024.11.06 |
[프로그래머스] 최소직사각형 - 완전탐색 (c++) (0) | 2024.11.06 |
[프로그래머스] 타겟넘버 - BFS/DFS (0) | 2024.10.24 |