250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준#BOJ#1939#중량제한
- 백준#BOJ#8012#한동이는영업사원
- 백준#boj#12755
- 백준#BOJ#2615#오목
- 백준#boj#16932#모양만들기
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#14501#퇴사#브루트포스
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 23562 ] ㄷ 만들기 본문
https://www.acmicpc.net/problem/23562
해설 : 단순 구현문제입니다. 그냥 모오오오오오오오오오든 경우의 수를 전부 해보면 됩니다.
크기가 1인 정사각형부터 시작해서 board 보다 크기가 커질때까지 count 해줍시다.
먼저 #의 개수를 전부 세줍시다.=>black
현재 (x,y) 에서 시작해서 ㄷ 모양을 탐색해 주면서 . 이면 #으로 바꾸어 줘야하니 count 해주고,
답을 갱신할때는 (a*count) + ((black + count) - (size*size*7))*b 라는 식을 이용해 줄 수 있겠죠.
//package com.boj.practice;
/**
* IO Template reference : 류호석
*/
import java.io.*;
import java.util.*;
import static java.lang.Math.*;
public class Main {
static FastReader scan = new FastReader();
static int n, m, a, b;
static String[] board;
static int black = 0;
public static void main(String[] args) throws IOException {
int t = 1;
//t = scan.nextInt();
while (t-- > 0)
solve();
}
static void solve() throws IOException {
n = scan.nextInt();
m = scan.nextInt();
a = scan.nextInt();
b = scan.nextInt();
board = new String[n];
for (int i = 0; i < n; i++) {
board[i] = scan.nextLine();
for (int j = 0; j < m; j++) {
if (board[i].charAt(j) == '#')
black++;
}
}
int ans = (int) 1e9;
for (int i = 1; ; i++) {
int ret = go(i);
if (ret >= (int) 1e9) break;
ans = min(ans, ret);
}
scan.write(Integer.toString(ans));
scan.flush();
}
static int go(int size) {
int ret = (int) 1e9;
for (int i = 0; i < n; i++) {
if (i + (size * 3 - 1) >= n) break;
for (int j = 0; j < m; j++) {
if (j + (size * 3 - 1) >= m) break;
int num = paint(i, j, size);
ret = min(ret, a * num + ((black + num) - (size * size * 7)) * b);
}
}
return ret;
}
static int paint(int x, int y, int size) {
int cnt = 0;
//위
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + (size * 3); j++) {
if (board[i].charAt(j) == '.')
cnt++;
}
}
//중간
for (int i = x + size; i < x + (size * 2); i++) {
for (int j = y; j < y + size; j++) {
if (board[i].charAt(j) == '.')
cnt++;
}
}
//아래
for (int i = x + (size * 2); i < x + (size * 3); i++) {
for (int j = y; j < y + (size * 3); j++) {
if (board[i].charAt(j) == '.')
cnt++;
}
}
return cnt;
}
static class FastReader {
BufferedReader br;
BufferedWriter bw;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
}
public FastReader(String s) throws FileNotFoundException {
br = new BufferedReader(new FileReader(new File(s)));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
void write(String str) throws IOException{
bw.write(str);
}
void flush() throws IOException{
bw.flush();
}
int nextInt() {
return Integer.parseInt(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
long nextLong() {
return Long.parseLong(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[ boj : 23563 ] 벽 타기 (0) | 2021.12.28 |
---|---|
[ boj : 14628 ] 입 챌린저 (0) | 2021.12.18 |
[자바 입출력] System.out.println()을 쓰지 말자! (0) | 2021.12.12 |
[Java8] Arrays.sort 람다(lambda)를 사용해서 내림차순 해보기 (0) | 2021.12.11 |
[ boj : 23560 ] 약 (0) | 2021.12.10 |