코테/백준

[백준/JAVA] 16937번: 두 스티커

imname1am 2024. 4. 29. 22:42
반응형

📖 문제

https://www.acmicpc.net/problem/16937

 

 

 

💡  풀이 방식

• 브루트포스

1. 입력되는 정보들을 저장한다.

2. 모든 스티커들에서 2개를 붙이는 경우를 탐색해 최대 넓이를 구한다.

  - [스티커1 붙이기] 항상 (0,0)을 기준으로 붙인다. (목적: 다음 스티커를 붙일 수 있는 최대 칸을 남기기 위해)

3. 최대 넓이를 구하면 결과로 출력하고, 못 구하면 0을 결과로 출력한다.

 

 

 

🔺 코드

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.*;
import java.io.*;
 
public class Main {
    static int H,W,N;
    static List<Sticker> list = new ArrayList<>();
    static int answer = 0;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        H = Integer.parseInt(st.nextToken());
        W = Integer.parseInt(st.nextToken());
        
        N = Integer.parseInt(br.readLine());
        
        while(N --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            int r = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            
            // 모눈종이에 붙이지 못하는 스티커면 pass
            if((r > H && r > W) || (c > W && c > H))    continue;
            list.add(new Sticker(r, c));
        }
        
        solve();
        System.out.println(answer);
    }
    
    // 모든 스티커 붙이는 경우 구하는 함수
    private static void solve() {
        // [1번째 스티커] (0,0) 기준으로 붙이기
        for(int i = 0 ; i < list.size() ; i++) {
            Sticker now = list.get(i);
            int size = now.r * now.c;
            
            // 1. 1번 스티커 붙여보기
            int tmpR = H - now.r;
            int tmpC = W - now.c;
            
            // 1번 스티커 붙이기 성공 시
            if(tmpR >= 0 && tmpC >= 0)
                second(i, tmpR, tmpC, size);
                
            // 2. 1번 스티커 회전해서 붙여보기
            tmpR = H - now.c;
            tmpC = W - now.r;
            
            // 회전한 1번째 스티커 붙이기 성공 시
            if(tmpR >= 0 && tmpC >= 0)
                second(i, tmpR, tmpC, size);
        }
    }
    
    // [2번째 스티커] 붙이는 함수
    private static void second(int idx, int rr, int cc, int size) {
        int secondSize = 0;
        
        for(int i = idx + 1 ; i < list.size() ; i++) {
            Sticker now = list.get(i);
            
            int tmpSize = now.r * now.c;    // 2번째 스티커 넓이
            
            // 모눈 종이에 영역에 2번째 스티커를 그대로 / 회전해 붙여볼 때 성공 시
            if((now.r <= rr && now.c <= W) || (now.r <= H && now.c <= cc)
                || (now.c <= rr && now.r <= W) || (now.c <= H && now.r <= cc))
                secondSize = Math.max(secondSize, tmpSize);
        }
        
        // 2번째 스티커 붙이기 성공 시, 최대 넓이 비교하기
        if(secondSize != 0)
            answer = Math.max(answer, size + secondSize);
    }
}
 
class Sticker {
    int r, c;
    
    public Sticker(int r, int c) {
        this.r = r;
        this.c = c;
    }
}
 
cs

 

 

 

 

➕ 다른 풀이 방식

 

[BOJ] 두 스티커 - 16937번

🎃문제설명크기가 H×W인 모눈종이와 스티커 N개가 있다. i번째 스티커의 크기는 Ri×Ci이다. 모눈종이는 크기가 1×1인 칸으로 나누어져 있으며, 간격 1을 두고 선이 그어져 있다.오늘은 모눈종이

velog.io

 


💦 어려웠던 점

- 소문자 h인지 H인지 이걸 잘못 써서 한 20분 헤맸다고 한다... 그래서 그냥 변수명을 새롭게 rr, cc로 바꿔버렸다.

 

 

🧐 새로 알게 된 내용

- 범위 저렇게 설정하는 것,,,,,

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 풀이 참고

 

[백준] code.plus(브루트 포스 Part 1,JAVA)16937번, 두 스티커

문제 링크 16937번: 두 스티커 첫째 줄에 모눈종이의 크기 H, W, 둘째 줄에 스티커의 수 N이 주어진다. 다음 N개의 줄에는 스티커의 크기 Ri, Ci가 주어진다. www.acmicpc.net 주의사항 JAVA를 사용하여 프로

tussle.tistory.com

 

반응형