Programming(199)
-
[AngularJS 1.x] EventQueue에서 Controller의 $scope를 사용하면 발생하는 문제 정리
UI 코드가 복잡해지면서 이벤트 리스너나 콜백에서 $scope에 할당한 데이터에 접근하는 식으로 구현을 했었다. 언뜻 보기에는 잘 동작하는 코드같았다. 하지만 다른 페이지로 이동했다가 돌아왔을 때 이상한 동작을 발견해서, 기록해놓기로 했다. 내가 작성하던 플랫폼은 Controller 로드 시 서버에서 받아온 데이터를, $scope에 할당하는 형식으로 구현되어있다. 이번에 구현한 기능은 이 기본적인 형식뿐만 아니라, 이미지를 계속해서 로드하면서 동시에 마우스 이벤트에 따라 이미지 위에 도형을 그려야했다. Canvas의 Background와 Flickering에 대한 삽질 기록에서 구현한 기능의 개선판이었다. Canvas의 Background와 Flickering에 대한 삽질 기록에서도 기술한 바 있듯 캔버..
2019.05.16 -
4-1. 그래프와 BFS
그래프 정점(Node, Vertex)과 간선(Edge)으로 이루어진 자료구조이다. 이때 간선은 정점간의 관계를 나타낸다. G = (V, E)로 나타낸다. 자세한 내용은 생략한다. 그래프의 표현 인접 행렬(Adjacency-matrix) 정점의 개수를 V라고 했을 때 VxV크기의 이차원 배열을 이용한다. a[i][j]는 i에서 j로 가는 간선의 존재 유무를 나타낸다.(0: 有, 1:無) 가중치를 표현하고 싶다면 0일때 간선이 없음, 1이상의 수일때 가중치로 표현할 수 있다. 인접 리스트(Adjacency-list) 리스트를 이용해서 구현한다. A[i]=i와 연결된 정점을 리스트로 표현한다. 리스트는 크기를 동적으로 변경할 수 있어야 하기 때문에, 일반적인 배열은 사용할 수 없다. 가중치를 표현할때는 리스트..
2019.05.14 -
2-4. 비트마스크
비트마스크 비트마스크를 이용해서 부분집합을 구할 수 있다는 점을 기억하고 가자. not 연산의 경우 자료형에 따라 결과가 달라진다. 또한, unsigned, signed에 따라서 보여지는 값이 달라진다. signed의 경우 가장 앞 자리 비트를 이용하여 음수/양수를 구별하기 때문이다. 정수의 집합을 나타낼 때 사용할 수 있다. 집합에는 같은수가 없기 때문이다. 570을 이진수로 나타내면 1000111010이 되는데, 이는 2^9+2^5+2^4+2^3+2^1로 나타낼 수 있다. 이를 통해서 주어진 수 570를 집합 {1, 3, 4, 5, 9}로 표현할 수 있다. 비트마스크를 사용하게되면 정수를 사용하는 것보다, 공간복잡도가 줄어들게 된다. 비트마스크의 연산 &를 사용하여 비트가 있는지 알 수 있다. |를 ..
2019.05.14 -
2-3. 재귀함수 사용하기
재귀 함수 함수 내에서 자기 자신을 다시 호출하는 함수이다. 이 함수를 잘 사용하면 N번의 반복문을 보다 보기 쉽게 작성할 수 있다. 단, 다중 루프문을 사용한 것보다 복잡도가 줄어들지는 않을 수 있다. 재귀 함수는 잘 짜는게 중요한데, 항상 다음의 경우를 고려해야 한다. 조건에 맞지 않는 경우(불가능한 경우) 정답을 찾은 경우 재귀 호출을 하는 경우(다음의 경우를 실행하는 경우) 9095 1, 2, 3 더하기, 백준 온라인 저지 정수 N을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 문제. 주어진 N이 3일 경우, 1, 2, 3의 합으로 나타내는 방법은 아래의 표와 같다. N=4 1+1+1+1 1+1+2 1+2+1 1+1+2 2+1+1 2+2 1+3 3+1 이 때, Ngoal, 즉 합산 결과가 ..
2019.05.13 -
2-2. 순열
순열 1~N까지 이루어진 순열로, 크기는 항상 N이며 겹치는 숫자가 존재하지 않는다. 크기가 N인 순열은 총 N!개가 존재한다. 순열을 사전순으로 나열했을 때, 다음에 오는 순열과 이전에 오는 순열을 찾을 수 있다. N이 3인 경우 사전순으로 나열한 수열은 다음과 같다. 아래의 표에서 1번째 순열은 오름차순으로 정렬된 순열이 되며, 마지막 순열(6번째 순열)은 내림차순으로 정렬된 순열임을 알 수 있다. 순서 수열 1번째 순열 123 2번째 순열 132 3번째 순열 213 4번째 순열 231 5번째 순열 312 6번째 순열 321 다음 순열 10972 다음 순열, 백준 온라인 저지 위에서 정리한 내용을 토대로 다음에 오는 순열을 찾을 수 있다. A\[i-1\] < A\[i\]를 만족하는 가장 큰 i를 찾는..
2019.05.12 -
2-1. 브루트 포스(주먹구구식), N중 for문
Brute Force 브루트 포스는 모든 경우의 수를 계산해보는 방법이다. 단, 경우의 수를 계산하는 데 걸리는 시간이 주어진 문제의 시간 제한을 넘지 않아야 한다. Brute Force 방식으로 문제를 풀 때 가능한 경우의 수를 모두 계산해본다. 직접 계산을 통해서 구하며, 대부분 손으로 계산해볼 수 있다. 모든 방법을 찾는다. 대표적으로는 직접 계산하는 방법, 반복문 사용, 순열 사용, 재귀 호출, 비트마스크를 사용하여 직접 계산하는 방법이 있다. 각각의 방법을 이용해 답을 구해본다. 그리고 시간 제한을 초과하지 않는 방법을 찾는다. Brute Force 문제의 시간복잡도는 보통 O(경우의 수*방법 1개를 시도해보는데 걸리는 시간 복잡도)가 된다. 일곱 난쟁이 일곱 난쟁이, 백준 온라인 저지 아홉명의..
2019.05.07