분류 전체보기 117

[자바스크립트] 클로저를 이용하여 속성값을 은닉하여 사용하기

클로저(CLOSURE)란 무엇일까? 자바스크립트는 렉시컬 스코프를 사용한다.렉시컬 스코프(정적 스코프)란,외부 렉시컬 환경(상위 스코프)에 대한 참조를 뜻하고,상위 스코프에 대한 참조는 함수가 정의된 위치에 의해 결정되는 것을 뜻한다. 즉, 특정 스코프 A에서 함수를 정의할 경우 그 함수의 렉시컬 스코프는 A가 된다. 자바스크립트에서 함수는 객체의 한 종류이고,내부 슬롯 [[Environment]]에 렉시컬 스코프를 저장한다.따라서 Environment 를 따라가면 실행 콘텍스트를 알 수 있고,자연스럽게 this 바인딩과 상위 스코프를 알 수 있다. 위의 관점에서 보면,상위 함수보다 중첩 함수가 더 오래 유지되는 경우에도중첩 함수는 이미 생명 주기가 끝난 상위 함수 내부의 값들에 접근할 수 있다.이런 중..

프론트앤드 2023.03.08

백준 1256 사전 - C++

최대 100개의 a와 100개의 z로 이루어진 문자열이 있다. 이를 사전 순으로 정리했을 때 k 번째 문자열이 무엇인지 알아내면 된다. K는 여기서 1억까지 가능하며, 문자열의 개수가 K보다 작으면 -1이다. a 가 3개, z 가 2개 있는 상황을 생각해 보자. 1. aaazz 2. aazza 3. aazaz 4. azaaz 5. azaza 6. azzaa 7. zaaaz 8. zaaza 9. zazaa 10. zzaaa 까지 총 10가지이며, 이는 고등학교? 중학교? 에서 배우는 순열과 조합에서 알 수 있다. (N+M)!/ N!/M! 여기서 트릭을 좀 쓸 수 있다. 위의 식에서 즉 조합은 nCk = n-1Ck + n-1Ck-1로 하나씩 줄일 수 있고, n-1Ck = n-2Ck + n-2Ck-1로 다시 ..

알고리즘 2023.03.08

백준 1103 게임 - C++

자기만 재밌는 게임을 한다고 한다... 직사각형 보드에서 동전이 구멍에 빠지거나 보드 바깥으로 나가지 않는 선에서 게임을 오래 즐기고 싶다고 한다. 최대 몇 번 움직이는지는 손으로 구해보면 쉽다. 보드의 크기는 최대 50x50이고 각 칸에 적혀있는 숫자는 1~9이며 구멍일 수 있다. 몇 가지 점을 빠르게 알 수 있다. 1. 내가 갈 수 있는 칸에 나와 똑같은 숫자가 있으면 무한번 움직일 수 있다. 1-1. 그러므로 무한번이 아닌 경우는 도착하는 숫자가 모두 다르다. 2. 한 번이라도 지나온 칸에 다시 도착한다면 무한번 움직일 수 있다. 2-2. 다시 도착하지 않는다면 반드시 게임은 종료되고, 따라서 그 칸에서 최대한 움직일 수 있는 횟수는 정해져 있다. 즉 무한번 움직일 수 있는지 판단은 두 가지로 할 ..

알고리즘 2023.03.07

백준1761 정점들의 거리 - C++

대표적인 LCA(최소 공통 조상, Lowest Common Ancestor) 문제이다. 정점을 트리로 만들고 두 노드 사이의 거리를 구하는 건 간단하다. 한 정점에서 출발해서 트리를 타고 가장 단거리로 다른 노드에 도착하기만 하면 되는 문제이기 때문이다. 하지만 이 문제는 2초의 시간 제한이 있고, 1만 개의 질문이 주어지므로 한 질문 당 20000 번 이하의 연산을 해야 한다. (왜냐하면 1만 x 2만 = 2억이기 때문에 C++ 에서 러프하게 2초로 잡을 수 있다.) 노드가 최대 4만개이기 때문에, 재수 없게도 일자로 쭉 펼쳐진 ㅡㅡㅡㅡㅡㅡㅡ 이런 트리일 때 양 끝의 노드만 계속 묻는다면 반드시 시간 초과가 뜬다. 물론 이런 극한의 케이스가 아니어도 보통은 시간 초과가 뜬다. 평균적으로 떨어져있는 기대..

알고리즘 2023.03.06

백준1525 퍼즐 - C++

굉장히 유명한 퍼즐이다. 이거.. 논란이 좀 있었던 문제인데 내부 사정이니 그러려니 하고 넘어간다.. 1.모든 경우의 수를 미리 계산 해놓고 주어진 상황에 맞는 수를 뱉는 방식이 있고, 2.완전탐색을 통해 제일 빠르게 원상태가 만드는 방식이 있고 3.손으로 풀듯이 최적의 방향으로 가산점을 부여하면서 움직일 수도 있겠다. 가장 쉬운 방식인 2번이.. 이번에 핫이슈였으므로 2번으로 완전탐색한다. #include #include #include #include using namespace std; int dy[] = { 0,-1,1,0 }; int dx[] = { -1,0,0,1 }; queue q1; map visited; #define initstate 123456789 //완전탐색 int findZero..

알고리즘 2023.03.03

백준15686 치킨 배달 - C++

모든 집의 치킨 거리의 합이 가장 작게 되도록 치킨집 M 개를 고르면 된다. 조금 더 빠르게 하기 위해서 각 집과 치킨집의 거리를 distmap [집][치킨집]으로 정해놓자. 이때 집과 치킨집을 지도에 직접 뿌릴 필요는 없다. 우리가 볼 건 지도를 직접 볼 필요가 없고 좌표만 가지고 계산하면 되기 때문이다. 그 후 완전 탐색을 이용하여 모든 경우의 수를 살핀다. 이 때 치킨집은 M개만 남기기 때문에 M개를 고른 후 distmap을 순회하여 가장 작은 값만 남기고 Min 값을 찾으면 된다. 집이 최대 2N = 100개고 치킨집이 M = 13 개 이므로 경우의 수는 13C5 * 100 * 13 이므로 시간이 오래 걸리지 않는다. #include int n,m; int ch, h;//치킨집 개수, 집 개수 i..

알고리즘 2023.03.01

SQL 한 컬럼에 있는 여러 값을 여러 컬럼으로 분리해서 합치기

오늘은 또 SQL 때문에 헤맸습니다. 제 상황은 이랬습니다. TABLE TEMP_TABLE NUMBER STATCODE NAME DATE USEYN 3002352 10 해운대 20120101 y 3002352 20 해운대 20120101 y 3002352 30 해운대 20120101 y 3003001 10 인천앞바다 20131111 y 3003001 20 인천앞바다 20131111 null 3003010 10 속초해수욕장 20221001 n 3003010 20 속초해수욕장 20221001 y 3003010 40 속초해수욕장 20221001 y 여기서처럼 number statCode 와 useYn 만 다르고 다른 필드들은 동일한 경우가 많았습니다. 위 상황을 number 와 date, name 으로 묶고,..

백앤드 2023.02.28

java.time.format.DateTimeParseException: Text could not be parsed at index 0

오늘은 짜-증나는 exception을 겪었다. 프론트에서 연도와 월을 픽한 후 백으로 날리는 과정인데, 'yyyyMM'의 String으로 날려주고 있었다. 나는 당연히 LocalDateTime과 DateTimeFormatter를 사용하여 String을 DateTime 형식으로 바꿔주려고 했으나 index0 오류 때문에 도저히 진행할 수가 없었다. 기존 실행했던 함수는 다음과 같다. String frontDate="201212"; LocalDateTime localDateTime; localDateTime = LocalDateTime.parse(frontDate, DateTimeFormatter.ofPattern("yyyyMM")); 당연히 에러가 났다. Unable to obtain LocalDateTi..

백앤드 2023.02.27

Sw Expert Academy 1494 사랑의 카운슬러 - C++

지렁이가 이동하는 총스칼라가 최소가 되게 하면 됩니다. 벡터의 크기는 편의상 루트를 없앤 x^2 + y^2로 계산합니다. 지렁이는 최대 20마리까지 존재하며 짝수입니다. 모든 좌표값은 -10만 c 벡터를 더하면 b 벡터이니, c 벡터는 b 벡터 - a 벡터입니다. 고로 두 점 사이의 거리는 (4,1) - (1,3) = (3, -2)이고, (0,0)과 (3,-2)의 거리는 3^2 + (-2)^2 = 13입니다. 다만, 다른 지렁이 벡터들도 모두 합한 후 거리를 구해주어야 합니다. 여기서 가장 가까운 지렁이로 가야 한다는 조건 때문에 가장 가까운 지렁이를 찾는 과정을 넣으시면 시간초과가 날 확률이 높습니다. 벡터의 합을 구하는 것이고, 벡터의 합은 완전히 더하기 빼기로만 이루어져 있으므로 자연스럽게 결합법칙..

알고리즘 2023.02.27

SW Expert Academy 4408 자기 방으로 돌아가기 - C++

아주 간단한 설명의 문제이다. 추억의 상황설정도 있고 문제 자체도 흥미롭다. 우선, 건너편 방으로 건너갈 때를 생각해보자. 만약 1번 학생이 400번 방에 들어간다면 1 ~ 400 번에 해당하는 동선이 막혀버린다. 만약 398 번에 들어간다면 1 ~ 398 번에 해당하는 동선이 막힌다. ... 만약 2번에 들어간다면 1 ~ 2번에 해당하는 동선이 막힌다. 만약 2번 학생이 399번 방에 들어간다면 1 ~ 400번에 해당하는 동선이 막힌다. 397번 방에 들어간다면 1 ~ 398번 동선이 막힌다. ... 1번 방에 들어간다면 1 ~ 2번 동선이 막힌다. 그럼, 같은 편 방으로 건너갈 때를 생각해보자. 만약 1번 학생이 399번으로 들어간다면 1 ~ 400번 동선이 막힌다. 397번으로 들어간다면 1 ~ 3..

알고리즘 2023.02.25