반응형
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
bool visited[2000001];
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int sum = brown + yellow; //격자의 총 개수
queue<int>q;
int temp = (int)sqrt(sum); //총 개수의 제곱근을 int로 저장
int num;
q.push(temp); //제곱근을 시작으로 탐색시작
while (!q.empty())
{
int x = q.front();
q.pop();
if (sum % x == 0) //x로 나누어떨어질 경우
{
int y = sum / x; //x * y = sum이 성립되기때문에 sum / x = y
if (x < y) //가로 길이는 세로길이와같거나 길어야 하기때문에 큰 값을 x로
{
num = y;
y = x;
x = num;
}
if (yellow % (x-2)==0) //-2를 하는 이유는 한줄마다 존재하는 yellow의 최대개수는 x-2이기때문에,
{ //여러줄 일 수 있기때문에 x-2를 나눈 나머지가 0인경우로 확인
answer.push_back(x);
answer.push_back(y);
return answer;
}
}
if (visited[x])continue; //방문한 값은 continue
q.push(x + 1); // 값에서 +1, -1을 push하여 탐색
if (x - 1 > 0)
q.push(x - 1);
visited[x] = true; //방문표시
}
}
int main()
{
ios::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
vector<int>c;
c = solution(18, 6);
for (auto it = c.begin(); it != c.end(); it++)
cout << *it << " ";
return 0;
}
후기
테스트케이스 4, 6, 7을 틀린다면 18, 6을 테스트해보고 반환값을 참고하여 수정하면된다.
bool visited[2000001];
배열의 최대값을 처음에 최대로 나올 수 있는 제곱근 값으로해서 여러번 틀렸다. (노란색격자의최대개수로 변경해야함)
if (yellow % (x-2)==0)
이 조건문을 생각을 못해서 테스트에서는 맞고 정확도에서 계속 틀렸다.
반응형
'Programming > Programmers' 카테고리의 다른 글
프로그래머스 가장먼노드 [c++] (0) | 2022.03.02 |
---|---|
프로그래머스 네트워크 [c++] (0) | 2022.02.26 |
프로그래머스 단속카메라 [c++] (0) | 2022.02.22 |
프로그래머스 구명보트 [c++] (0) | 2022.02.21 |
프로그래머스 체육복 Level 1 [c++] (0) | 2022.02.20 |