-
Garden
Gaaaaaaaaaarden https://www.acmicpc.net/problem/18809
Algorithm
- 초록색 배양액과 빨간색 배양액을 뿌릴 수 있는 모든 조합을 구한다.
- 각각의 경우에 대해 배양액을 퍼뜨리며 피울 수 있는 꽃을 센다.
- 피울 수 있는 꽃의 최대 개수를 출력한다.
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
- '임도연파'는 4명이 넘지 않도록 총 7명의 학생들로 구성
- 담은 학생들을 상대로 상하좌우 서로 인접한지 확인
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이 포함되어 있습니다.
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등을 차지하고 있습니다.
-