728x90

(1) 문제

  • 흑백 영상을 압축하여 표현하는 데이터 구조로 쿼드 트리(Quad Tree)라는 방법이 있다. 흰 점을 나타내는 0과 검은 점을 나타내는 1로만 이루어진 영상(2차원 배열)에서 같은 숫자의 점들이 한 곳에 많이 몰려있으면, 쿼드 트리에서는 이를 압축하여 간단히 표현할 수 있다.
  • 주어진 영상이 모두 0으로만 되어 있으면 압축 결과는 "0"이 되고, 모두 1로만 되어 있으면 압축 결과는 "1"이 된다. 만약 0과 1이 섞여 있으면 전체를 한 번에 나타내지를 못하고, 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래, 이렇게 4개의 영상으로 나누어 압축하게 되며, 이 4개의 영역을 압축한 결과를 차례대로 괄호 안에 묶어서 표현한다

  • 위 그림에서 왼쪽의 영상은 오른쪽의 배열과 같이 숫자로 주어지며, 이 영상을 쿼드 트리 구조를 이용하여 압축하면 "(0(0011)(0(0111)01)1)"로 표현된다.  N ×N 크기의 영상이 주어질 때, 이 영상을 압축한 결과를 출력하는 프로그램을 작성하시오.

 


(2) 입력

  • 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또는 1의 숫자로 이루어져 있으며, 영상의 각 점들을 나타낸다.

 


(3) 출력

  • 영상을 압축한 결과를 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys
import math

square_length = int(sys.stdin.readline())

square_list = []
square_store = []

def DFS(square_arrow_list):
    square = square_arrow_list
    half_size = len(square) // 2

    square_left_up_list = []
    square_rigth_up_list = []
    square_left_down_list = []
    square_right_down_list = []

    for i in range(half_size):
        temp_left_up_list = []
        temp_rigth_up_list = []
        temp_left_down_list = []
        temp_right_down_list = []

        for j in range(half_size):
            # 왼쪽 위
            temp_left_up_list.append(square[i][j])
            # 오른쪽 위
            temp_rigth_up_list.append(square[i][j + half_size])
            # 왼쪽 아래
            temp_left_down_list.append(square[i + half_size][j])
            # 오른쪽 아래
            temp_right_down_list.append(square[i + half_size][j + half_size])

        square_left_up_list.append(temp_left_up_list)
        square_rigth_up_list.append(temp_rigth_up_list)
        square_left_down_list.append(temp_left_down_list)
        square_right_down_list.append(temp_right_down_list)

    print('(', end='')
    is_zero_one(square_store, square_left_up_list)
    is_zero_one(square_store, square_rigth_up_list)
    is_zero_one(square_store, square_left_down_list)
    is_zero_one(square_store, square_right_down_list)
    print(')', end='')


def is_zero_one(square_store, square_arrow_list):
    is_zero = False
    is_one = False
    for row in square_arrow_list:
        if not is_one or not is_zero:
            if 1 in row:
                is_one = True
            if 0 in row:
                is_zero = True
        else:
            break

    if is_one and is_zero:
        DFS(square_arrow_list)
        square_store.append(square_arrow_list)
    elif not is_zero:
        print(1, end='')
    else:
        print(0, end='')

for i in range(square_length):
    string = sys.stdin.readline().rstrip('\n');
    temp_list = []
    for char in string:
        temp_list.append(int(char))
    square_list.append(temp_list)

is_zero_one(square_store, square_list)


(6) 실행결과


반응형
728x90

(1) WIL(Weekly I Learned) - 6주차

  • 4/2일 아쉬웠던 주특기(Spring) 심화가 끝나고 드디어 기다리던 클론코딩 프로젝트가 시작되었습니다.
  • 팀은 총 4인 백엔드(Spring) 2분(저 포함), 프론트엔드(React) 2분으로 구성되었으며 또 다시 팀장을 맡게되었습니다.

(2) 일정

  • 4/2 1차멘토링 전까지 - S.A완료
  • 4/5 ~ 4/6 - 2차 멘토링
  • 4/8 - '쌀 팔다 개발자' 김병욱님 강연
  • 4/8 자정까지 - 클론코딩 결과물 제출
  • 4/9 10:00 ~ 11:00 - 다른조 클론코딩 둘러보기
  • 4/9 11:00 - 미니프로젝트2 발제

(3) 배운점

  • S3를 이용한 이미지 업로드
  • CORS - 타 IP에서 접근을 허용
  • Spring Boot 에서의 JWT 토큰 사용
  • @Valid - 유효성 검사
  • Git - Pull Request
  • Controller 예외처리 및 에러 메세지 보내기

 

 


(4) 클론 코딩


(5) 느낀점

  • 처음으로 백엔드와 프론트엔드로 나누어 프로젝트를 진행하는 경험을 할 수 있었습니다. 혼자만의 속도가 아닌 팀원 전체의 속도에 맞추다보니 완벽하게 프로젝트를 마무리 하지 못하여 아쉬움이 있었지만 그래도 여러사람과의 협업을 통해 프로젝트를 진행 해보았다라는것에 의미가 있었습니다.
  • 매 주차마다 제출하는 단원평가에 코드리뷰, 피드백이 없다 등 아쉬움점을 적어서 인지 스파르타에서 14시~16시에 튜터님이 상시 대기하며 질문 받는 코너가 새로 생겨 프로젝트를 진행 하다 막히는 부분이나 이론상 이해가 안되는 부분이 있으면 물어볼 수 있어 좋았습니다.

반응형
728x90

(1) WIL(Weekly I Learned) - 5주차

  • 3/26일 이전 주특기(Spring)기본을 끝마치고 5주차 주특기(Spring)심화 가 시작되었습니다.
  • 이전과 달리 두분 다 처음보는 분들과 팀원이 되었으며, 랜덤으로 지정된다는 팀장역할을 처음 하게되었습니다.

(2) 일정

  • 3/29 (13:30 ~ 16:30) - 소규모 면담 (신청자 한에서)
  • 3/31 (19:00 ~ 20:00) - 항해톡 (SSL, JWT, index(database), ORM) 크루원 중 신청자 발표
  • 4/1 까지 숙제 완료!
  • 4/2 (~10:00) - 클론 코딩 발제

(3) 배운점

  • Controller
    • Servlet
    • Controller
    • RestController
  • DI
  • Bean
  • IoC
  • 스프링 시큐리티
    • 소셜로그인(카카오)
    • OAuth
  • 테스트 케이스
    • JUnit
    • Mock, Mockito
    • 통합 테스트
  • 영속성

(4) 기본 과제

  • 조건
    • 회원가입
      • 닉네임, 비밀번호 조건에 안맞는경우 에러메세지
    • 로그인 및 검사
    • 소셜로그인
    • 게시글 / 댓글 조회
    • 댓글 작성 / 수정 / 삭제 (로그인 및 자기가 작성한 사용자만)
    • 회원가입 테스트 코드 작성
  • 링크 - loafly.shop/ (현재 닫은 상태)

(5) 느낀점

  • 심화에서는 기본에서 배웠던것에 대한 전체적인 리뷰와 Servlet을사용한 코드, Controller와 RestController를 사용한 코드 등 여러 방법에 대해 배웠습니다.
  • Spring 시큐리티를 이용한 로그인 기능과 소셜로그인 기능을 구성 해 봄으로써 Spring에서 로그인은 기본적으로 도움을 주는 기능들이 있구나 느꼇습니다.
  • 전체적으로 강의 내용이 코드를 전체복사, 붙여넣기 방식으로 진행되어 이해하지 못한부분도 많이 있어 다른강의를 보거나 개인적으로 공부하여 스프링에 대해 더 자세히 알아야 할 필요가 있다고 느꼇습니다.
  • 과제를 해도 코드리뷰, 과제답안 등 피드백이 없어 과제를 잘했는지 잘 못했는지 감을 잡을 수 없어 아쉬움이 있습니다.

반응형

+ Recent posts