๐ 1. ๋ฌธ์ ์ค๋ช
๐ก 2. ์ ๊ทผ๋ฐฉ์
์ผ๋จ ์ซ์ ์ฌ์ด์ ๊ท์น์ ์ฐพ์์ฃผ์๋ค.
๋
ธํธ์ ํด์ ์ข ์ง์ ๋ถํ๋ฐ
brown + yellow๋ฅผ ํด ์ค ๋ค ๊ทธ ์ซ์์ ์ฝ์๋ฅผ ๋ชจ๋ ์ฐพ์๋ธ๋ค. ์ฝ์๋ค์ ์ค๊ฐ๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ์ซ์์ด๋ค.
๋์ , ์
์ถ๋ ฅ ์๋ฅผ ๋ณด๋ฉด ๋ ํฐ ์ซ์๊ฐ ๊ฐ๋ก์ด๊ณ ๋ ์งง์ ์ซ์๊ฐ ์ธ๋ก๋ค.
brown | yellow | return |
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
์ฌ๊ธฐ์ brown + yellow ํด ์ฃผ๋ฉด ๊ฐ๊ฐ
10+2 = 12
8 + 1 = 9
24 + 24 = 48
12์ ์ฝ์ [1, 2, 3, 4, 6, 12]
9์ ์ฝ์ [1, 3, 9]
48์ ์ฝ์ [1, 2, 3, 4, 6, 8, 12, 16, 24, 48] ์ค ์ ๋ต์
์ฝ์์ ๊ฐฏ์๊ฐ ์ง์๋ฉด ๊ฐ์ด๋ฐ ์๋ ์ซ์ ๋ ๊ฐ ์ด๋ค. (์ถ๋ ฅ์ ํฐ ์ซ์ ๋จผ์ ํด์ผ ํจ)
์ฝ์์ ๊ฐฏ์๊ฐ ํ์๋ฉด ๊ฐ์ด๋ฐ ์ซ์๋ฅผ ๋ ๋ฒ ๋ฐ๋ณต ํด ์ค๋ค.
๊ทธ๋ผ ์ฝ์๊ฐ ๋ด๊ธด ArrayList๋ฅผ divisor์ด๋ผ๊ณ ํ๋ฉด ํด๋น ์ซ์๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์ธ๋ฑ์ค๋
์ฝ์์ ๊ฐฏ์๊ฐ ์ง์์ ๊ฒฝ์ฐ divisor.size()/2, divisor.size()/2-1
ํ์์ ๊ฒฝ์ฐ divisor.size()/2 ๋ ๋ฒ์ด๋ค.
โญ 3. ๋ด ์ฝ๋
์ฒซ๋ฒ์งธ ์๋ ํ๋ฆผ
ํ๋ฆฐ ์ด์ : ์ฝ์ ์ค ํฐ๊ฑฐ ๋จผ์ ์ถ๋ ฅํด์ผ ํ๋๋ฐ ์์๊ฑฐ๋ถํฐ ์์๋๋ก ์ถ๋ ฅํ๋ค ๋ณด๋ ๋ฐฐ์ด ๋ด์์ ๋ ์ซ์์ ์๋ฆฌ๊ฐ ๋ฐ๋์ด ์ถ๋ ฅ๋จ
์ ์๋ฌ์ ๋ฐ๋ผ ์์ ํด ์ค ์ฝ๋(์ ๋ต ์๋)
import java.util.ArrayList;
class Solution {
public int[] solution(int brown, int yellow) {
int pl = brown + yellow; // brown๊ณผ yellow์ ํฉ์ ๊ตฌํจ
ArrayList<Integer> divisor = new ArrayList<>();
ArrayList<Integer> answer = new ArrayList<>();
// mul์ ์ฝ์๋ฅผ ์ฐพ์ divisor ๋ฆฌ์คํธ์ ์ถ๊ฐ
for (int i = 1; i <= mul; i++) {
if (pl % i == 0) {
divisor.add(i);
}
}
int index1 = 0;
int index2 = 0;
// ์ฝ์๊ฐ ์ง์ ๊ฐ์์ผ ๊ฒฝ์ฐ
if (divisor.size() % 2 == 0) {
index1 = divisor.size() / 2;
index2 = divisor.size() / 2 - 1;
answer.add(divisor.get(index1));
answer.add(divisor.get(index2));
} else {
// ์ฝ์๊ฐ ํ์ ๊ฐ์์ผ ๊ฒฝ์ฐ
index1 = divisor.size() / 2;
index2 = divisor.size() / 2;
answer.add(divisor.get(index1));
answer.add(divisor.get(index2));
}
// ArrayList<Integer>๋ฅผ int[]๋ก ๋ณํ
int[] intArray = answer.stream().mapToInt(Integer::intValue).toArray();
return intArray;
}
}
๋๋ฒ์งธ ์๋ ๋ํ๋ฆผ
์ ํ์ฑ 76.9๋ก
์ค๋ต์ฒ๋ฆฌ ๋์๋ค.
์ค๋ต์ ๋ฆฌ
์ 76์ ์ง๋ฆฌ ์ฝ๋์ธ๊ฐ
1. ์ง์/ํ์ ์กฐ๊ฑด ์ฌ์ฉ ๋ถ์ ํ
divisor.size()๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง์/ํ์๋ฅผ ๋๋์ด ์ฒ๋ฆฌํ์ง๋ง, ๋ฌธ์ ์ ์กฐ๊ฑด์์ ๊ฐ๋ก์ ์ธ๋ก ๊ธธ์ด๋ฅผ ์ง์ ๋น๊ตํ๋ ๋
ผ๋ฆฌ๊ฐ ์์.
์ค์ ๋ฌธ์ ๋ ์ฝ์๋ฅผ ๋จ์ํ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ, ์ฝ์ ์ ์ค ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ๋ก์ ์ธ๋ก๋ฅผ ์ฐพ๋ ์์
์ ํด ์ค์ผ ํจ.
2. ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ฐ์ํ์ง ์์
brown๊ณผ yellow์ ๋ฐฐ์น๋ฅผ ๊ณ ๋ คํ ์์ด ์๊ธฐ ๋๋ฌธ.
์๋ฅผ ๋ค์ด, (๊ฐ๋ก - 2) * (์ธ๋ก - 2) = yellow ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
(๊ฐ๋ก - 2) * (์ธ๋ก - 2) = yellow ์กฐ๊ฑด์ ๊ณ ๋ คํด์ผ ํ๋ ์ด์ ๋ ๋ฌธ์ ์ ๊ตฌ์กฐ์ ์กฐ๊ฑด ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค. ๋ฌธ์ ์ ์๊ตฌ์ฌํญ์ ๋จ์ํ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ด๋ถ์ ํ
๋๋ฆฌ์ ๊ตฌ์ฑ์ ๋ง์กฑํ๋ ๊ฐ๋ก์ ์ธ๋ก๋ฅผ ์ฐพ์์ผ ํ๋ค. `(๊ฐ๋ก - 2) * (์ธ๋ก - 2) = yellow`๋ ์ด ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋์ง ํ์ธํ๊ธฐ ์ํ ํต์ฌ ์กฐ๊ฑด์ธ ์
์ด๋ค.
brown๊ณผ yellow์ ๋ฐฐ์น
- `brown`์ ์ง์ฌ๊ฐํ์ ํ
๋๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค.
- `yellow`๋ ์ง์ฌ๊ฐํ์ ๋ด๋ถ ์์ญ์ ์ฑ์ด๋ค.
= ์ฆ, `yellow`๋ ํ
๋๋ฆฌ๋ก ๋๋ฌ์ธ์ธ ๋ด๋ถ ๊ณต๊ฐ์ ๋์ด์ด๋ค.
์) brown = 10, yellow = 2์ธ ๊ฒฝ์ฐ, ์ง์ฌ๊ฐํ์ ๋ฐฐ์น
BBBB
BYYB
BBBB
๋ฌธ์ ์ ์กฐ๊ฑด
์ง์ฌ๊ฐํ์ ์ ์ฒด ๋์ด = brown + yellow
์ง์ฌ๊ฐํ ๋ด๋ถ์์ (๊ฐ๋ก - 2) * (์ธ๋ก - 2)๋ ํ ๋๋ฆฌ๋ฅผ ์ ์ธํ yellow ๋ถ๋ถ์ ๋์ด
๊ณ์ฐ
๊ฐ๋ก์ ์ธ๋ก ๊ธธ์ด๊ฐ width์ height์ผ ๋ ์ ์ฒด ๋์ด = width * height = brown + yellow
ํ
๋๋ฆฌ๋ฅผ ์ ์ธํ ๋ด๋ถ ๋์ด๊ฐ Yellow์ ๊ฐ์์ผ ํ๋ค.
yellow = (width - 2) * (height - 2)
๐ฆ ์ ๋ต์ฝ๋(์์ ํ์)
class Solution {
public int[] solution(int brown, int yellow) {
int area = brown + yellow; // ์ ์ฒด ๋์ด
// ์ ์ฒด ๋์ด์ ์ฝ์ ํ์
for (int height = 1; height <= Math.sqrt(area); height++) {
if (area % height == 0) { // area(๋์ด)์ height(๋์ด)๊ฐ ์ ํํ ๋๋์ด๋จ์ด์ง๋์ง ํ์ธ
int width = area / height; // ๊ฐ๋ก๋ ๋์ด๋ฅผ ๋์ด๋ก ๋๋ ๊ฐ
// ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธ
if ((width - 2) * (height - 2) == yellow) {
return new int[] { width, height }; // ๊ฐ๋ก ≥ ์ธ๋ก ์กฐ๊ฑด์ ์๋์ผ๋ก ๋ง์กฑ
}
}
}
return new int[] {};
}
}
์ฝ์ ํ์์ ํ ๋ ์ ๊ณฑ๊ทผ๊น์ง๋ง ํ์ํ๋ ์ด์ ?
์ฝ์๋ ๋์นญ์ ์ธ ํน์ฑ์ ๊ฐ์ง. ์ด๋ค ์ ์ N์ ์ฝ์๋ ์(pair)์ผ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ.
์๋ฅผ ๋ค์ด, N=36์ผ ๋ ์ฝ์๋ (1*36), (2*18), (3*12), (4*9), (6*6)
์ฝ์๋ ์๋ก ๊ณฑํด์ N์ด ๋๋ ๋ ์ซ์๋ค์ด๊ธฐ ๋๋ฌธ์ ์ ๊ณฑ๊ทผ์ ๊ธฐ์ค์ผ๋ก ๋์นญ์ ์ผ๋ก ๋ํ๋๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ๋ฃจํธ 36 = 6 ์ดํ์๋ ์์๋ง ๋ฐ๋ (9*4), (12*3), (18*2), (36*1)์ด ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ํ์ํ ํ์๊ฐ ์๋ค.
๐๐ป์ข์์ ์ ์ผ ๋ง์ด ๋ฐ์ ์ฝ๋
๊ทผ์ ๊ณต์์ผ๋ก ํ๋ค๋
import java.util.*;
class Solution {
public int[] solution(int brown, int red) {
int a = (brown+4)/2;
int b = red+2*a-4;
int[] answer = {(int)(a+Math.sqrt(a*a-4*b))/2,(int)(a-Math.sqrt(a*a-4*b))/2};
return answer;
}
}
class Solution {
public int[] solution(int brown, int red) {
for(int i=1; i<=red; i++) {
if(red%i==0 && (red/i+i)*2+4==brown) {
return new int[] {red/i+2, i+2};
}
}
return null;
}
}
๐๐ป 4. ๊ฐ์ ์ ํ ๋ฌธ์ (์์ ํ์)
'Algorithm > Programmers_Best' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ ๋ ฅ๋ง์ ๋๋ก ๋๋๊ธฐ (์์ ํ์) (6) | 2024.11.23 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ํผ๋ก๋ (์์ ํ์) (56) | 2024.11.22 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ชจ์๊ณ ์ฌ ๋ฌธ์ ํ์ด (์์ ํ์) (39) | 2024.11.15 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ต์ ์ง์ฌ๊ฐํ ๋ฌธ์ ํ์ด (์์ ํ์) (33) | 2024.11.15 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ง๊ฒ๋ค๋ฆฌ (์ด๋ถํ์) (42) | 2024.11.15 |