자료구조&알고리즘/백준
[백준] 색종이-2 2567번 (PYTHON,JAVA)
고쩡이
2024. 3. 7. 13:12
✔ 문제 2567 색종이-2
2567번: 색종이 - 2
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변
www.acmicpc.net
핵심 아이디어
먼저 2차원배열에 1로 색종이를 표시한다. 둘레 탐색은 두가지 방법이 있다.
1. 전체순회를 하며, 1을 만나면 해당 위치를 기준으로 4방향을 탐색해 0의 개수를 센다.
2. 함수를 가로,세로 방향으로 쭉 탐색하며 0>1,1>0 이 바뀌는 경계개수를 센다.
풀이에선 두번째 방법을 이용했다.
+) 파이썬에서 전치를 할때는 zip(*list)를 이용했다. 예를들어, [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] list를 *로 unpacking 해주게 되면 [1, 2, 3], [4, 5, 6], [7, 8, 9] 3개의 iterable한 자료형이 된다. zip은 이 자료형을 index끼리 묶어 반환하게 된다.
PYTHON
def count(arr):
cnt = 0
for lst in arr:
for i in range(1, len(lst)):
if lst[i-1] != lst[i]: # 현재값과 직전의 값이 다르면 경계선!
cnt+=1
return cnt
N = int(input())
arr = [[0]*102 for _ in range(102)]
for _ in range(N):
# 해당영역을 1로 표시
sj, si = map(int, input().split())
for i in range(si, si+10):
for j in range(sj, sj+10):
arr[i][j] = 1
arr_t = list(zip(*arr)) # 전치행렬: 수정필요시 list(map(list, zip(*arr)))
ans = count(arr) + count(arr_t)
print(ans)
JAVA
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[102][102];
for (int k = 0; k < N; k++) {
StringTokenizer tokenizer = new StringTokenizer(br.readLine());
int sj = Integer.parseInt(tokenizer.nextToken());
int si = Integer.parseInt(tokenizer.nextToken());
for (int i = si; i < si + 10; i++) {
for (int j = sj; j < sj + 10; j++) {
arr[i][j] = 1;
}
}
}
int[][] arr_t = transpose(arr);
int ans = count(arr) + count(arr_t);
System.out.println(ans);
}
private static int[][] transpose(int[][] arr) {
int rows = arr.length;
int cols = arr[0].length;
int[][] transposed = new int[cols][rows];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
transposed[j][i] = arr[i][j];
}
}
return transposed;
}
private static int count(int[][] arr) {
int cnt = 0;
for (int[] lst : arr) {
for (int i = 1; i < lst.length; i++) {
if (lst[i - 1] != lst[i]) {
cnt += 1;
}
}
}
return cnt;
}
}