• Garden

    Gaaaaaaaaaarden

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

    Algorithm

    1. 초록색 배양액과 빨간색 배양액을 뿌릴 수 있는 모든 조합을 구한다.
    2. 각각의 경우에 대해 배양액을 퍼뜨리며 피울 수 있는 꽃을 센다.
    3. 피울 수 있는 꽃의 최대 개수를 출력한다.

    for comb in combinations(range(len(spot)), G + R):
        comb = set(comb)
    
        for g in combinations(comb, G):
            g = set(g)
            r = comb - g
    
            MAX = max(MAX, spread())
    

    Key Point

    • 좌표들의 조합은 combinations(range(len(spot)) 와 같이 List 인덱스 조합으로 구할 수 있다.
    • set을 활용하여 조합을 구하는 것은 효율적이다.


    def spread():
        tboard = copy.deepcopy(board)
        count = 0
    
        Gq = deque([spot[index] for index in g])
        Rq = deque([spot[index] for index in r])
    
        for x, y in Gq:
            tboard[x][y] = 0
        for x, y in Rq:
            tboard[x][y] = 0
    
        while Gq and Rq:
            for _ in range(len(Gq)):
                x, y = Gq.popleft()
                if tboard[x][y] == 'F':
                    continue
    
                for k in range(4):
                    nx, ny = x + dx[k], y + dy[k]
                    if 0 <= nx < N and 0 <= ny < M and tboard[nx][ny] == 1:
                        tboard[nx][ny] = 'G'
                        Gq.append((nx, ny))
    
            for _ in range(len(Rq)):
                x, y = Rq.popleft()
                for k in range(4):
                    nx, ny = x + dx[k], y + dy[k]
                    if 0 <= nx < N and 0 <= ny < M:
                        if tboard[nx][ny] == 'G':
                            tboard[nx][ny] = 'F' # flower
                            count += 1
                        elif tboard[nx][ny] == 1:
                            tboard[nx][ny] = 0
                            Rq.append((nx, ny))
    
            for x, y in Gq:
                if tboard[x][y] == 'G': # expired
                    tboard[x][y] = 0
    
        return count
    

    Key Point

    • 배양액이 만나 꽃이 피면 그 지점에서는 더 이상 탐색하지 않는다.
    • 빨간색 배양액이 초록색 배양액을 만나지 못했다면 만료시킨다.
    • 현재 위치에 꽃이 피어있다면 CONTINUE.
  • 소문난 칠공주

    소문난 칠공주

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

    Algorithm

    1. '임도연파'는 4명이 넘지 않도록 총 7명의 학생들로 구성
    2. 담은 학생들을 상대로 상하좌우 서로 인접한지 확인

    def dfs(c, point, yc):
        global ans
        if yc >= 4:
            return
        if c == 7:
            if check():
                ans += 1
            return
    
    
        for cur in range(point, 25):
            x = cur // 5
            y = cur % 5
    
            Set.append(cur)
            if board[x][y] == 'Y':
                dfs(c + 1, cur + 1, yc + 1)
            else:
                dfs(c + 1, cur + 1, yc)
            Set.remove(cur)
    

           KEY POINT

    • 2차원 배열의 1차원 배열 표기법
      x = point // 5, y = point % 5

    • 그래프의 오름차순적 접근 (1, 2, 24 -> 1, 3, 4)
      각 재귀마다 현재 지점으로부터 for문 탐색


    def check():
        queue = deque()
        queue.append(Set[0]) # start
        visited = [False for _ in range(25)]
        visited[Set[0]] = True
    
        count = 1
        while queue:
            index = queue.popleft()
            tx = index // 5
            ty = index % 5
            for k in range(4):
                nx, ny = tx + dx[k], ty + dy[k]
                Next = nx * 5 + ny
                if 0 <= nx < 5 and 0 <= ny < 5 and not visited[Next]:
                    if Next in Set:
                        visited[Next] = True
                        count += 1
                        queue.append(Next)
        if count == 7:
            return True
        else:
            return False
    
  • CSS 구성과 특징

    CSS의 구성

    span {
    color : red;
    }
    
    • span : selector (선택자)
    • color : property
    • red : value

    Style을 HTML에 적용하는 세 가지 방법

    1. inline
    HTML태그 안에 적용함으로써, 다른 CSS파일과 비교하여 가장 높은 우선순위를 갖습니다.

    <p style="border:1px solid gray;color:red;font-size:2em;">


    2. internal
    Style 태그로 지정합니다. 별도의 CSS파일을 관리하지 않아도 되며 서버에 CSS파일을 부르기 위해 브라우저가 요청을 보낼 필요가 없습니다. 하지만 구조와 스타일이 섞이게 되므로 유지보수가 어렵습니다.

    <head>
    <style>
    p  {
      font-size : 2em;
      border:1px solid gray;
      color: red;
    }
    </style>
    </head>
    
    <body>
    <div>...</div>
    </body>
    



    3. external
    외부파일(.css)로 지정하는 방식입니다. CSS 코드가 아주 짧지 않다면 가급적 이 방법으로 구현하는 것이 가장 좋습니다. 현업에서는 여러개의 CSS 파일로 분리하고 이를 합쳐서 서비스에서 사용하기도 합니다. internal 코드와 같은 css코드를 구현하고, style.css와 같은 별도 파일로 만듭니다.

      이후에 아래처럼 link태그로 추가하면 됩니다.

    <html>
        <head>
            <link rel="stylesheet" href="style.css">
        </head>
        <body>
            <div>
                <p>
                    <ul>
                        <li></li>
                        <li></li>
                        <li></li>
                        <li></li>
                    </ul>
                </p>
            </div>
        </body>
    </html>
    



    inline은 별도의 우선순위를 갖지만, internal 과 external은 우선순위가 동등합니다. 따라서 겹치는 선언이 있을 경우 나중에 선언된 속성이 반영됩니다.

  • 브라우저의 동작 원리

    WEB을 통해서 전달되는 데이터는 어딘가에서 해석되어야 합니다. 서버에서 전송한 데이터(HTML)가 클라이언트에 도착해야 할 곳은 Browser입니다. Browser에는 데이터를 해석해주는 Parser와 데이터를 화면에 표현해주는 Rendering Engine이 포함되어 있습니다.



    kingdom

    Safari 브라우저에서 실행되는 webkit 렌더링엔진의 처리과정


    HTML을 해석해서 DOM Tree를 만들고, CSS를 해석해서 CSS Tree(CSS Object Model)을 만듭니다. 이 과정에서 Parsing 과정이 필요하며 토큰 단위로 해석되는 방식은 일반적인 소스코드의 컴파일 과정과 유사합니다.

    DOM Tree와 CSS Tree, 이 두 개는 연관되어 있으므로 Render Tree로 다시 조합되어 화면에 어떻게 배치할지 크기와 위치 정보를 담고 있습니다. 이후에 이렇게 구성된 Render Tree정보를 통해서 화면에 어떤 부분에 어떻게 색칠을 할지 Painting 과정을 거치게 됩니다.

  • 저급, 고급 언어의 정의

    저급 언어

    저급 언어는 기계 중심의 언어입니다. 기계가 직접 알아들을 수 있는 말로 ‘프로그램 코드를 작성한다’고 말할 수 있습니다. 2진수로 이뤄진 값으로 작성하는 프로그래밍 언어를 기계어(Machine Language)라고 말합니다.

    숫자로만 되어 있기 때문에 유지보수도 굉장히 어렵습니다. 숫자로만 된 프로그래밍 언어는 사용이 굉장히 어려웠습니다. 그래서, 이 숫자로 된 문장과 1:1로 대응하는 기호를 만들고, 그 기호로 프로그래밍을 하게 되었습니다. 단, 기호로 작성된 프로그램은 기계가 바로 알아들을 수 없기 때문에 기호로 작성된 문장들을 원래의 숫자로 바꿔야 하는 과정이 더 필요하게 되었습니다.

    이러한 과정에서 사용되는 도구를 컴파일러(Compiler)라고 말하며, 이러한 기호로 작성된 언어를 어셈블리어(Assembly Language)라고 말합니다.



    고급 언어

    고급 언어는 사람 중심의 언어입니다. 사람이 좀 더 이해하기 쉬운 문법으로 프로그래밍을 할 수 있습니다. 이런 일이 가능하기 위해선 작성된 소스코드를 번역하는 과정이 필요합니다. 이를 컴파일한다고 말하며, 이러한 일을 수행하는 것을 컴파일러라고 말합니다. 이러한 고급 언어로는 다음과 같은 언어들이 있습니다.

    • FORTRAN : 최초의 고급언어 중의 하나라고 말할 수 있으며, 과학 계산용으로 주로 사용됩니다. 현재 공대에서도 많이 사용되고 있습니다.

    • COBOL : FORTRAN과 더불어 역사가 오래된 언어입니다. 일반 업무에서 사용할 목적으로 만들어졌으며, 현재도 은행 등에서 사용되고 있습니다.

    • PROLOG : 논리형 프로그래밍 언어로써, 논리식을 토대로 오브젝트와 오브젝트 간의 관계에 관한 문제를 해결하기 위해 사용됩니다.

    • C : 1972년 미국 벨 연구소의 데니스 리치에 의해 개발된 고급 언어로써 시스템 프로그래밍에 가장 적합한 평가를 받는 언어입니다.

    • Erlang :스웨덴의 에릭슨에서 개발한 함수형 병행성 프로그래밍 언어이며 통신 인프라를 위한 언어입니다.

    • Lisp : LISt Processsor의 약자로써 대표적인 함수형 언어입니다. 프로그래밍 언어의 역사를 말할 때, 현대의 컴퓨터를 위해 등장한 고급 언어 중 가장 오래된 것이 포트란이고, 두 번째로 오래된 것이 바로 이 리스프입니다.

    • Swift : 2014년 WWDC(Apple WorldWide Developers Conference)에서 공개한 프로그래밍 언어입니다. 최근에 만들어진 언어로 현대 프로그래밍 언어의 발전을 대다수 계승한 모던 프로그래밍 언어라고 말할 수 있습니다.

    • Kotlin : IntelliJ IDEA의 개발사 JetBrains에서 2011년에 개발한 프로그래밍 언어입니다. JVM기반의 언어이며 Java와의 상호 운영이 100% 지원됩니다. Swift와 마찬가지로 현대 프로그래밍 언어의 발전을 대다수 계승한 모던 프로그래밍 언어라 말할 수 있습니다.

    • Clojure : 클로저(Clojure)는 리치 히키(Rich Hickey)가 만든 리스프 프로그래밍 언어의 방언으로서, 범용 함수형 언어입니다.

    • Python : 프로그래밍 입문자가 읽기 쉽고 적은 코드를 사용하여 프로그램을 개발할 수 있습니다. 많은 사람에게 추천되는 언어이며, 데이터 과학에서도 자주 사용되며 웹사이트 개발에서도 많이 사용되고 있습니다. 최근 python은 ML (machine learning)에서도 많이 사용됩니다.

    • JAVA : 1995년 썬 마이크로 시스템즈에서 개발한 객체지향 프로그래밍 언어입니다. 거의 매년 세계에서 가장 많이 사용되는 인기 1등을 차지하고 있습니다.