๋ฌธ์
[๋ฐฑ์ค 18111๋ฒ]
ํ ๋ ๋์ํํธ๋ ๋ํ ์ค๋น๋ฅผ ํ๋ค๊ฐ ์ง๋ฃจํด์ ธ์ ์๋๋ฐ์ค ๊ฒ์์ธ ‘๋ง์ธํฌ๋ํํธ’๋ฅผ ์ผฐ๋ค.
๋ง์ธํฌ๋ํํธ๋ 1 × 1 × 1(์ธ๋ก, ๊ฐ๋ก, ๋์ด) ํฌ๊ธฐ์ ๋ธ๋ก๋ค๋ก ์ด๋ฃจ์ด์ง 3์ฐจ์ ์ธ๊ณ์์ ์์ ๋กญ๊ฒ ๋ ์ ํ๊ฑฐ๋ ์ง์ ์ง์ ์ ์๋ ๊ฒ์์ด๋ค.
๋ชฉ์ฌ๋ฅผ ์ถฉ๋ถํ ๋ชจ์ lvalue๋ ์ง์ ์ง๊ธฐ๋ก ํ์๋ค.
ํ์ง๋ง ๊ณ ๋ฅด์ง ์์ ๋ ์๋ ์ง์ ์ง์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ ๋์ด๋ฅผ ๋ชจ๋ ๋์ผํ๊ฒ ๋ง๋๋ ‘๋ ๊ณ ๋ฅด๊ธฐ’ ์์ ์ ํด์ผ ํ๋ค.
lvalue๋ ์ธ๋ก N, ๊ฐ๋ก M ํฌ๊ธฐ์ ์งํฐ๋ฅผ ๊ณจ๋๋ค. ์งํฐ ๋งจ ์ผ์ชฝ ์์ ์ขํ๋ (0, 0)์ด๋ค.
์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์ด ์งํฐ ๋ด์ ๋ ์ ๋์ด๋ฅผ ์ผ์ ํ๊ฒ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ ์ข ๋ฅ์ ์์ ์ ํ ์ ์๋ค.
1. ์ขํ (i, j)์ ๊ฐ์ฅ ์์ ์๋ ๋ธ๋ก์ ์ ๊ฑฐํ์ฌ ์ธ๋ฒคํ ๋ฆฌ์ ๋ฃ๋๋ค.
2. ์ธ๋ฒคํ ๋ฆฌ์์ ๋ธ๋ก ํ๋๋ฅผ ๊บผ๋ด์ด ์ขํ (i, j)์ ๊ฐ์ฅ ์์ ์๋ ๋ธ๋ก ์์ ๋๋๋ค.
1๋ฒ ์์ ์ 2์ด๊ฐ ๊ฑธ๋ฆฌ๋ฉฐ, 2๋ฒ ์์ ์ 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค. ๋ฐค์๋ ๋ฌด์์ด ๋ชฌ์คํฐ๋ค์ด ๋์ค๊ธฐ ๋๋ฌธ์ ์ต๋ํ ๋นจ๋ฆฌ ๋ ๊ณ ๋ฅด๊ธฐ ์์ ์ ๋ง์ณ์ผ ํ๋ค. ‘๋ ๊ณ ๋ฅด๊ธฐ’ ์์ ์ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ๊ณผ ๊ทธ ๊ฒฝ์ฐ ๋ ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์์ค.
๋จ, ์งํฐ ์๋์ ๋๊ตด ๋ฑ ๋น ๊ณต๊ฐ์ ์กด์ฌํ์ง ์์ผ๋ฉฐ, ์งํฐ ๋ฐ๊นฅ์์ ๋ธ๋ก์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ํ, ์์ ์ ์์ํ ๋ ์ธ๋ฒคํ ๋ฆฌ์๋ B๊ฐ์ ๋ธ๋ก์ด ๋ค์ด ์๋ค. ๋ ์ ๋์ด๋ 256๋ธ๋ก์ ์ด๊ณผํ ์ ์์ผ๋ฉฐ, ์์๊ฐ ๋ ์ ์๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, M, B๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ M, N ≤ 500, 0 ≤ B ≤ 6.4 × 107)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ๊ฐ M๊ฐ์ ์ ์๋ก ๋ ์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค.
(i + 2)๋ฒ์งธ ์ค์ (j + 1)๋ฒ์งธ ์๋ ์ขํ (i, j)์์์ ๋ ์ ๋์ด๋ฅผ ๋ํ๋ธ๋ค. ๋ ์ ๋์ด๋ 256๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ์ ๊ณ ๋ฅด๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ๋ ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์์ค. ๋ต์ด ์ฌ๋ฌ ๊ฐ ์๋ค๋ฉด ๊ทธ์ค์์ ๋ ์ ๋์ด๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ์ถ๋ ฅํ์์ค.
์์
ํ์ด
Brute Force ๋ฌธ์ ์ง๋ง ์ฌ๋ฐ์ ๊ฒ ๊ฐ์์ ํ์ด๋ณด์๋ค.
์กฐ๊ธ ๋จ์ํด ๋ณด์ด๋ ๋ฌธ์ ์ด์ง๋ง, ์ฌ๋ฌ ์กฐ๊ฑด์ด ๊น๋ค๋ก์ ๋ค.
1. ๋ธ๋ญ์ ํ๋ ์๊ฐ๊ณผ ์ค์นํ๋ ์๊ฐ์ด ๋ค๋ฅด๋ค.
2. ํ ๋ธ๋ญ์ ์ธ๋ฒคํ ๋ฆฌ์ ๋ฃ์ด์ ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
3. ๊ฐ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉด ๋ ๋์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
4. ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ๋์ด๋ฅผ ๋ชจ๋ ์ถ๋ ฅํ๋ค.
0. ์ฑ๊ณต ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int n;
public static int m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int[][] land = new int[n][m];
int blocks = 0;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < m; j++) {
int block = Integer.parseInt(st.nextToken());
land[i][j] = block;
blocks += block;
}
}
// ํ๋ณด ์ถ์ถ
int average = blocks / (n * m);
blocks += b; //๋
์ ์๋ ๋ธ๋ญ + ๊ฐ๊ณ ์๋ ๋ธ๋ญ ๋ชจ๋ ํฉํ๊ธฐ
// maxHeight & minHeight ์ ํ๊ธฐ
int maxHeight = blocks / (n * m); //๋
์ ์๋ ๋ธ๋ญ๊ณผ ๊ฐ๊ณ ์๋ ๋ธ๋ญ์ผ๋ก ์์ ์ ์๋ ์ต๋ ๋์ด
if (maxHeight > 256) { //์ต๋ ๋์ด๋ 256
maxHeight = 256;
}
int minHeight = 0;
//ํ๊ท ์ผ๋ก๋ถํฐ ์๋ก ์๋ ๋ฐฉํฅ ๊ฒ์ฌ
int minTimeUpSide = Integer.MAX_VALUE;
int currentHeightUpside = average; //ํ๊ท ๋ถํฐ ์์
boolean isDone = false;
while (!isDone) {
if (currentHeightUpside > maxHeight) { //์ต๋ ๋์ด๋ฅผ ๋์๋์ง ๊ฒ์ฌ
break;
}
int currentTime = calTime(land, currentHeightUpside); //๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ฒ์ฌ
if (currentTime <= minTimeUpSide) { // ๋ง์ฝ ๊ฑธ๋ฆฐ ์๊ฐ์ด ๋ ์๋ค๋ฉด (=์ ๋ฃ์ด์ ๊ฐ์ ์๊ฐ์ด์ด๋ ๋์ด๊ฐ ํฌ๋ค๋ฉด ํฐ๊ฒ ์ ์ฅ๋จ)
minTimeUpSide = currentTime; //minTime์ ์ ์ฅ
currentHeightUpside++; //๋ค์ ๋์ด (์ ๋ฐฉํฅ)
} else {
isDone = true;
}
}
currentHeightUpside--; // ๋์ด ๋ณต๊ตฌ
//ํ๊ท ์ผ๋ก๋ถํฐ ์๋๋ก ์๋ ๋ฐฉํฅ ๊ฒ์ฌ
int minTimeDownSide = Integer.MAX_VALUE;
int currentHeightDownside = average; //ํ๊ท ๋ถํฐ ์์
isDone = false;
while (!isDone) {
if (currentHeightDownside < minHeight) { //์ต์ ๋์ด๋ฅผ ๋์๋์ง ๊ฒ์ฌ
break;
}
int currentTime = calTime(land, currentHeightDownside); //๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ฒ์ฌ
if (currentTime < minTimeDownSide) { //๋ง์ฝ ๊ฑธ๋ฆฐ ์๊ฐ์ด ๋ ์๋ค๋ฉด
minTimeDownSide = currentTime; //minTime์ ์ ์ฅ
currentHeightDownside--; //๋ค์ ๋์ด (์๋ ๋ฐฉํฅ)
} else{
isDone = true;
}
}
currentHeightDownside++; //๋์ด ๋ณต๊ตฌ
if (minTimeUpSide <= minTimeDownSide) { //์ ๋ฐฉํฅ์ ์๊ฐ์ด ๋ ์งง๋ค๋ฉด (=์ ๋ฃ์ด์ ๋ ๋์ ๋์ด๊ฐ ์ถ๋ ฅ๋จ)
System.out.println(minTimeUpSide + " " + currentHeightUpside );
}else System.out.println(minTimeDownSide+ " " + currentHeightDownside); //์๋ซ ๋ฐฉํฅ์ ์๊ฐ์ด ๋ ์งง๋ค๋ฉด
}
public static int calTime(int[][] land ,int height) {
int time = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int diff = height - land[i][j];
if ( diff >= 0) {
time += diff;
} else time += -diff * 2;
}
}
return time;
}
}
1. ๋ฌธ์ ํ์ด
Brute Force
ํผ์ ํ์ด๋ณด๊ณ ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ ํ์ด๋ฅผ ๋ณด์๋๋ฐ,
๊ฑฐ์ ์์ธ ๋ธ๋ญ๋ค์ ์ต์์ ์ต๋ ๋์ด๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ๊ฑฐ๋, 0์นธ๋ถํฐ ์ต๋ ๋์ด๊น์ง ๋ชจ๋ ๊ฒ์ฌํ๋๊ฒ ๋๋ถ๋ถ์ด์๋ค.
์๊ฐ์ด ๊ฐ์ฅ ์งง๊ฒ ๊ฑธ๋ฆฌ๋ ๋์ด๋ผ๋ฉด, ํ์ฌ ๋ธ๋ญ๋ค์ ๋์ด์ ๋น์ทํ๊ฒ ๋ค ~ ๋ผ๋ ์๊ฐ์ผ๋ก,
๋๋ ์ต๋ํ ํจ์จ์ ์ผ๋ก ํ์ํด๋ณด๊ธฐ ์ํด ํ๊ท ๊ฐ์ ๋์ ํด ๋ณด์๋ค.
๋ด ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ ๋ค.
1. ํ์ฌ ๋ ์ ์์ฌ์๋ ๋ธ๋ญ๋ค๊ณผ, ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ธ๋ญ๋ค์ ๋ชจ๋ ํฉํ๋ค. (์ค์นํ ์ ์๋ ๋ชจ๋ ๋ธ๋ญ์ ๋ชจ์๋ค.)
2. ๋ชจ๋ ๋ธ๋ญ๋ค์ ํ๊ท ๊ฐ(=๋์ด)์ ๊ตฌํ๋ค.
3. ํ๊ท ๊ฐ๋ถํฐ ์์ํด์, ์๋ก ์์๊ฐ๋ ๋ฐฉ์๊ณผ ์๋๋ก ์์๊ฐ๋ ๋ฐฉ์์ ๋ชจ๋ ์งํํ๋ฉด์, ํด๋น ๋์ด๋ฅผ ๋ง๋๋๋ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ตฌํ๋ค.
4. ์๋ก ์์๊ฐ๋ ๋ฐฉ์ ์ค ๊ฐ์ฅ ์๊ฐ์ด ์งง์ ๋์ด์, ์๋๋ก ์์๊ฐ๋ ๋ฐฉ์ ์ค ๊ฐ์ฅ ์๊ฐ์ด ์งง์ ๋์ด๋ฅผ ๊ตฌํ๋ค.
์๋ก&์๋๋ก ์์๊ฐ๋ค๊ฐ, ๋์ด์ ์ต์๊ฐ์ด ๋์ค์ง ์๋๋ค๋ฉด ๊ทธ๋ง๋๋ค. (๋ธ๋ญ์ ์๊ฑฐ๋ ์บ๋๋ฐ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก, ๋ ์ด์์ ๋์ ๋์ด๋ ๋ฎ์ ๋์ด๋ ๊ณ์ฐํ์ง ์์๋ ์ต์๊ฐ์ด ๋์ง ์๋๋ค.)
5. ๋ ๊ฐ ์ค ์๊ฐ์ด ์งง์ ๋์ด์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
๋ง์ฝ ๊ฐ๋ค๋ฉด ์๋ก ์์๊ฐ ๋ฐฉ์์ ๋์ด์ ์๊ฐ์ ์ถ๋ ฅํ๋ค. (์๊ฐ์ด ๊ฐ๋ค๋ฉด ๋์ด๊ฐ ๋์ ์๊ฐ์ ์ถ๋ ฅ)
์ฌ๊ธฐ์ ์ต๋ ๋์ด๋ 1๋ฒ์์ ๊ตฌํ ๊ฐ / N*M ๊ฐ์ด๋ค. ๋ง๋ค ์ ์๋ ๋์ด ์ค ์ต๋ ๊ฐ์ด๋ค.
์ต์ ๋์ด๋ 0์ด๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ค Brute Force๋ฌธ์ ๊ฐ ์ ์ผ ์ฌ๋ฐ๋ ๊ฒ ๊ฐ๋ค.
์ ํด์ ธ ์์ง ์์ ์๊ณ ๋ฆฌ์ฆ ๋ด์์ ์์ ๋กญ๊ฒ ๊ตฌํํ๋ ๋งค๋ ฅ์ด ์๋ ๊ฒ ๊ฐ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์ด๋ถํ์ (0) | 2024.03.01 |
---|---|
[Java] BFS์ ํ์ฉ - ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2024.02.29 |
[Java] DFS์ BFS (2) | 2024.02.27 |