※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소입니다.
https://programmers.co.kr/learn/courses/30/lessons/42842
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
3.1 주석 없는 코드
3.2 주석 있는 코드
3.3 테스트 코드
4. 결과
1. 문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 모서리는 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. |
문제!!
Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요. |
제한사항
|
예시
brown | red | return |
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
2. 문제풀이
풀어보면 간단한 문제였다. 테두리가 갈색이고 가운데가 빨간색이라고 한다. 그렇다면 높이는 최소 3이될것이다.(그래야 위아래가 갈색에 가운데가 빨간색이니까) 그렇다면 갈색과 빨간색의 합을 임의의 높이로 나누어 가로길이를 구한 뒤에 (가로-2) * (높이 -2) 가 빨간색칸의 개수와 맞다면 현재의 가로와 세로길이를 찾은것이다. -2를 하는이유는 모든 테두리가 갈색으로 칠해져 있기 때문이다. |
3. 소스코드
3.1 주석없는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <vector>
using namespace std;
vector<int> solution(int brown, int red) {
vector<int> answer;
int sum = brown + red;
for (int height = 3; ; height++) {
if (!(sum % height)) {
int weight = sum / height;
if (((height - 2) * (weight - 2)) == red) {
answer.push_back(weight);
answer.push_back(height);
break;
}
}
}
return answer;
}
|
3.2 주석있는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <vector>
using namespace std;
vector<int> solution(int brown, int red) {
vector<int> answer;
//전체개수 계산
int sum = brown + red;
//높이는 최소3부터 시작
for (int height = 3; ; height++) {
//총합을 높이로 나누었을때 나머지가 0일때만
if (!(sum % height)) {
//합을 높이로 나누면 가로길이가 된다.
int weight = sum / height;
//테두리는 갈색이므로 2줄씩 빼고 계산
//높이에서 2개를빼고 가로길이에서 2개를 빼고 곱한값이 빨간색개수와 같다면 가로 세로 높이를 찾은것이다.
if (((height - 2) * (weight - 2)) == red) {
answer.push_back(weight);
answer.push_back(height);
break;
}
}
}
return answer;
}
|
3.3 테스트 코드 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#include <iostream>
#include <vector>
using namespace std;
vector<int> solution(int brown, int red) {
vector<int> answer;
//전체개수 계산
int sum = brown + red;
//높이는 최소3부터 시작
for (int height = 3; ; height++) {
//총합을 높이로 나누었을때 나머지가 0일때만
if (!(sum % height)) {
//합을 높이로 나누면 가로길이가 된다.
int weight = sum / height;
//테두리는 갈색이므로 2줄씩 빼고 계산
//높이에서 2개를빼고 가로길이에서 2개를 빼고 곱한값이 빨간색개수와 같다면 가로 세로 높이를 찾은것이다.
if (((height - 2) * (weight - 2)) == red) {
answer.push_back(weight);
answer.push_back(height);
break;
}
}
}
return answer;
}
void print(int b, int r){
for (auto a : solution(b, r))
cout << a << " ";
cout << endl;
}
int main() {
print(10, 2);
print(8, 1);
print(24, 24);
return 0;
}
|
4. 결과
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
큰 수 만들기(그리디, 탐욕법)[프로그래머스] (8) | 2019.12.07 |
---|---|
조이스틱 C++(그리디, 탐욕법)[프로그래머스] (2) | 2019.12.07 |
괄호 변환 C++(카카오 2020)[프로그래머스] (0) | 2019.12.05 |
체육복 C++(그리디,탐욕법)[프로그래머스] (1) | 2019.12.03 |
숫자야구 C++(완전탐색)[프로그래머스] (0) | 2019.12.02 |
댓글