일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BaaS
- 프로그래머스
- 너비 우선 탐색
- Vue
- 설치과정
- docker
- 코딩테스트
- 도커
- 타원곡선
- 비트코인
- 모각코
- kubernets
- golang
- Props
- k8s
- ChangeCipherSpec
- Jenkins
- FAAS
- kubernetes
- sia
- alert
- vue.js
- cloud
- observability
- 숨바꼭질3
- Programmers
- 13549
- 서버리스
- 백준
- Docker-compose
- Today
- Total
작업공간
2nd Meet - 코독하구만 본문
Daily Object
- 분할정복법 예제를 풀어보고, 지난 주 학습했던 시간복잡도를 예제에 적용해서 구해본다.
- 웹크롤링 코드를 따라쳐보며 어떤 식으로 동작하는 지 알아본다.
Review
- 알고리즘 예제를 풀며 시간과 메모리 비용을 줄이기 위해 메모리 할당 방법, 조건문 설정 등을
생각하며 했더니 효율성이 훨씬 좋아졌다.
- 시간이 부족해 네이버 홈페이지를 크롤링하는 데에서 멈추었다.
다음 모각코엔 크롤링한 데이터를 분석하는 시간을 가져야겠다.
Divide And Conquer
문제의 크기가 작다면 풀이가 쉽다. + 문제의 크기를 최소한으로 줄여 최소 크기의 문제를 풀어 나아간다.
-> 작은 서브 문제를 만들고 이를 큰 문제에 적용함으로써 문제를 해결한다.
이번 시간에 풀어본 예제
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서
www.acmicpc.net
처음 생각한 풀이방법
1 ) 입력 N에 맞는 2^N x 2^N 크기의 정수배열을 생성한다.
2 ) 칸 수 4 로 4등분이 가능하다면 분할한다. 이 때 Z모양을 생각하며 분할 순서를 정한다.
3 ) 4등분이 불가능해진다면 Z모양대로 num ( 전역변수 )을 넣고 num +=1을 해준다.
4 ) 모든 칸이 채워지면 해당 입력 r,c의 배열 값을 불러와 출력한다.
-> 출력은 정답과 같음. 하지만 메모리 초과가 발생함
Why?
0 < N <16 인데 N = 15가 들어오면 생성되는 정수배열 Matrix[15][15]의 배열 1개당 1Byte라고 쳐도
1GB가 된다.
Solution
배열을 생성하지않고 찾아야할 r,c 좌표의 위치만을 생각하며 분할정복을 한다.
다시 생각한 풀이방법
1 ) 4등분을 할 때 좌표가 해당하는 사분면을 분할한다. num은 1, 2, 3, 4분면에 따라 다르게 가산된다.
( 1사분면 A * 0/4 | 2사분면 A * 1/4 | 3사분면 A * 2/4 | 4사분면 A * 3/4 )
2 ) 4등분이 불가능할 때 Z모양 중 ( r , c )좌표의 위치에 따라 num을 1~3을 가산하고, 리턴하여 종료한다.
-> 시간초과가 있지만 메모리초과는 일어나지 않았다.
( 시간복잡도를 줄이는 방법은 더 생각해봐야겠다. )
백준 1074 - Z 코드
import java.util.Scanner;
public class Main {
static int num = 0;
static int result = 0;
public static void dac(int size, int row, int col, int r, int c) {
if (size == 2) {
if (((row <= r) && (r <= row + 1)) && ((col <= c) && (c <= col + 1))) {
if ((row == r) && (col + 1 == c)) {
num += 1;
} else if ((row + 1 == r) && (col == c)) {
num += 2;
} else if ((row + 1 == r) && (col + 1 == c)) {
num += 3;
}
result = num;
return;
} else {
num += 4;
}
} else {
if((r < row+size/2) && (c < col+size/2)){
dac(size / 2, row, col, r, c);} // 1
else if ((r < row+size /2 )&&( c >= col+size/2)){ // 2
num += size*size/4;
dac(size / 2, row, col+(size / 2), r, c);
}
else if ((r >= row+size/2 )&&( c < col+size/2)){ // 3
num += size*size*2/4;
dac(size / 2, row +(size / 2), col, r, c);
}
else{ // 4
num += size*size*3/4;
dac(size / 2, row+(size / 2), col+(size / 2), r, c);
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = (int) Math.pow(2, sc.nextInt());
int r = sc.nextInt();
int c = sc.nextInt();
dac(N, 0, 0, r, c);
System.out.println(result);
}
}
웹 크롤링
간단한 웹크롤링 코드를 따라쳐보며 Naver 홈페이지의 Text 데이터와 Html을 크롤링했다.
'2020 동계 코독하구만' 카테고리의 다른 글
5th Meet - 코독하구만 (0) | 2021.01.24 |
---|---|
4th Meet - 코독하구만 (0) | 2021.01.13 |
3rd Meet - 코독하구만 (0) | 2021.01.05 |
1st Meet - 코독하구만 (0) | 2020.12.23 |
2020 겨울방학 모각코 계획 (0) | 2020.12.17 |