✔ 문제 10163 색종이
10163번: 색종이
평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘
www.acmicpc.net
핵심 아이디어
먼저 색종이 번호를 해당하는 색종이 영역에 표시한다. 그리고 count를 이용해 빈도수를 세어준다.
이때 풀이시간을 단축하고 코드를 최적화해보자.먼저 빈도수 체크를 할때 처음에는 for 각 번호들에 대해, 전체 배열에서 각 번호수를 count했다.하지만 빈도수 체크 배열을 만들면 전체 배열 탐색을 한번만 탐색해도 된다.
또한,배열 초기화를 for j (sj, sj + w) : arr[i][j] = [n] * w으로 바꿔 슬라이싱을 사용해 좀 더 효율적인 코드를 만들 수 있다.
PYTHON
N = int(input())
arr = [[0] * 1001 for _ in range(1001)]
for n in range(1, N + 1):
sj, si, w, h = map(int, input().split())
for i in range(si,si + h):
for j in range(sj, sj + w):
arr[i][j] = n # 해당 번호 색종이 숫자를 영역에 표시
for n in range(1, N + 1): # 색종이 번호별 카운트
cnt = 0
for lst in arr:
cnt += lst.count(n)
print(cnt)
개선 풀이
N = int(input())
arr = [[0]*1001 for _ in range(1001)]
for n in range(1, N+1):
sj, si, w, h = map(int, input().split())
for i in range(si, si+h):
arr[i][sj:sj+w] = [n]*w
cnts = [0]*(N+1)
for lst in arr:
for n in lst:
cnts[n] += 1
print(*cnts[1:], sep='\n')
JAVA
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] arr = new int[1001][1001];
for (int n = 1; n <= N; n++) {
int sj = sc.nextInt();
int si = sc.nextInt();
int w = sc.nextInt();
int h = sc.nextInt();
for (int i = si; i < si + h; i++){
for (int j = sj; j < sj + w; j++){
arr[i][j] = n;
}
}
}
int[] cnts = new int[N + 1]; // [색종이번호] = 카운팅
for(int[] row : arr) {
for (int n : row) {
cnts[n]++;
}
}
for (int i = 1; i < cnts.length; i++){
System.out.println(cnts[i]);
}
}
}
'자료구조&알고리즘 > 백준' 카테고리의 다른 글
[backjoon] 2461번 대표선수 풀이(Python) (0) | 2025.04.05 |
---|---|
[백준] 직사각형을 만드는 방법 8320번 (PYTHON,JAVA) (0) | 2024.03.29 |
[백준] N과 M(1) 15649번 (PYTHON,JAVA) (0) | 2024.03.15 |
[백준] 약수 구하기 2501번 (PYTHON,JAVA) (0) | 2024.03.11 |
[백준] 색종이-2 2567번 (PYTHON,JAVA) (0) | 2024.03.07 |