카펫
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
brown yellow return
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.
우리는 언제나 문제에 마주하면 "어떻게 해야할까?" 를 먼저 생각해야합니다.
처음으로 눈에 띈것은 예제에
brown + yellow = return갑의 0번째 * 1번째 라는 규칙이 있습니다.
#include <string>
#include <vector>
#include <math.h>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int carpet = brown + yellow;
for(int i=2; i<=carpet; i++){
if(carpet % i == 0){
if(i >= floor(carpet/i)){
answer.push_back(i);
answer.push_back(carpet/i);
break;
}
}
}
return answer;
}
첨엔 이런식으로 풀이를 생각했지만 테스트케이스 4, 6, 7에서 실패가 납니다.
만약 brown = 22, yellow = 8인 경우
ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
ㅁㅇㅇㅇㅇㅇㅇㅇㅇㅁ
ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
[10, 3]이 돼야하는데
ㅁㅁㅁㅁㅁㅁ
ㅁㅁㅇㅇㅁㅁ
ㅁㅁㅇㅇㅁㅁ
ㅁㅁㅇㅇㅁㅁ
ㅁㅁㅁㅁㅁㅁ
[6, 5]이런식으로 되기 때문입니다
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int carpet = brown + yellow;
for(int i=2; i<=carpet; i++){
if(carpet % i == 0){
int width = i;
int height = carpet/i;
if(width >= height){
if((width-2) * (height-2) == yellow){
answer.push_back(i);
answer.push_back(height);
break;
}
}
}
}
return answer;
}
검색결과 width와 height이름으로 하는것이 더 깔끔하고 직관적으로 보여서 변수를 선언하고
위에서 말한듯 우리는 상하좌우 brown을 각 1칸씩 즉 상하에 2 좌우에 2를 빼고 곱한값이 yellow와 같다면 우리가 찾는 답을 얻을 수 있습니다.
어떤분들은 첫 for문에서 i=carpet/2로 시작하고 i를 빼면서 하시던데 이렇게 해도 시간은 잘 나오기에 저는 증가식으로 했습니다.
예외적인 테스트케이스로 어려움을 겪는것... 예상치 못한 변수나 상황들이 당황케하는데 코테 문제풀이는 마치 우리네 인생이 아닐까요?
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 약수의 개수와 덧셈 (0) | 2021.06.09 |
---|---|
[프로그래머스] 3진법 뒤집기 (0) | 2021.06.09 |
[프로그래머스] 모의고사 cpp (0) | 2021.05.03 |
[프로그래머스] Level 1 모의고사 (0) | 2021.04.26 |
[프로그래머스] 두 개 뽑아서 더하기 (0) | 2021.03.29 |