분류 전체보기 187

[Algorithm] 정렬된 배열에서 특정 수의 개수 구하기

문제 N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있다. 이 때, 이 수열에서 x가 등장하는 횟수를 계산하시오. 풀이 입력되는 수열이 오름차순이고, 완전 탐색으로 몇개인지 셀 수 있지만, 시간복잡도에서 O(N)의 시간 복잡도를 가지게 된다. 이보다 이진검색트리를 사용하면 O(logN)의 시간 복잡도로 해결할 수 있다. 먼저, x보다 큰 수의 인덱스를 찾는다. 그리고 x보다 크거나 같은 수의 인덱스를 찾아 빼면 갯수를 확인할 수 있다. 왼쪽 인덱스는 타겟과 크거나 같은 수의 인덱스를 찾는다. public static int leftIndex (int start, int end) { while (start < end) { int mid = (start + end) / 2; if (arr[mid]..

Algorithm 2021.06.18

[AWS] Windows에서 AWS Linux SSH 연결

맥OS나 Linux OS의 경우 SSH 클라이언트를 통해 접근할 수 있다. Windows는 기본으로 제공하지 않기 때문에 SSH client를 다운받거나, PuTTy를 이용해 접근할 수 있다. 1. 생성된 인스턴스 정보에서 퍼블릭 DNS 확인 먼저 인스턴스를 우클릭하여 [연결] 클릭 인스턴스 연결에서 SSH 클라이언트를 이용한 방법을 본다. 항목을 살펴보면 1. SSH 클라이언트는 PuTTy를 사용한다. 2. 프라이빗 키 파일은 확장자명을 pem으로 가진 파일을 인스턴스 생성 시 다운받을 수 있다. (관리 주의) 3. 퍼블릭 DNS를 제공한다. (나중에 접속할 때 필요하다.) 2. PuTTygen을 통해 프라이빗 키 생성 AWS에서 pem 확장자를 가진 프라이빗 키는 PuTTy에서 바로 사용할 수 없다...

Anything 2021.06.17

[Algorithm] 카드 정렬하기

문제 정렬된 두 묶음의 숫자 카드가 있을 때, 각 묶음의 카드의 수를 A, B라고 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B번 비교를 해야 한다. 매우 많은 숫자 카드 묶음이 책상 위에 있다. 이들을 두 묶음씩 골라 서로 합쳐나가면 고르는 순서에 따라서 비교 회수가 달라진다. N개의 숫자 카드 묶음의 각각의 크기가 주어질 때, 최소한 몇 번의 비교가 필요한지 구하는 프로그램을 작성하시오. 풀이 먼저 각 묶음마다 몇개 인지 적힌 배열을 정렬했다. 그리고 앞에서부터 합하면서 계산했다. import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ..

Algorithm 2021.06.17

[Algorithm] 안테나

문제 일직선 상의 마을에 여러 채의 집이 위치해 있다. 이 중에서 특정 위치의 집에 특별히 한 개의 안테나를 설치하기로 했다. 효율성을 위해 안테나로부터 모든 집까지의 거리의 총합이 최소가 되도록 설치하려고 한다. 집들의 위치 값이 주어질 때 안테나를 설치할 위치를 선택하는 프로그램을 작성하시오. 풀이 주어지는 집들의 위치를 정렬시키고, 집 들 중 가운데 위치한 집에 설치하는 것이 가장 효율적이다. 정렬된 리스트에서 (길이 - 1) / 2 인덱스를 가진 값을 출력한다. import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.next..

Algorithm 2021.06.16

[Anything] GCP에서 웹 서비스 배포

개발된 웹 애플리케이션을 GCP나 AWS에서 배포할 때 github를 통해 관리되고 있는 프로젝트를 가져와 빌드 후 배포한다. 1. github에서 프로젝트 가져오기 git clone {github_repos}.git 2. gradle 프로젝트 빌드 프로젝트 디렉터리 내에 접근하고, 먼저 gradlew의 권한을 변경한다. (실행 권한 부여) cd {project_directory} chmod 755 gradlew 프로젝트 빌드를 시도한다. ./gradlew build 3. jar 파일을 통해 서비스 배포 프로젝트 디렉터리 내에 build/libs에 jar파일 저장되어있다. java -jar {파일}.jar 위 명령어를 통해 서비스 배포. SSH를 나오면 중단되는데 아래의 명령어로 실행하면 백그라운드로 실..

Anything 2021.06.16

[Algorithm] 인구 이동

문제 N X N 크기의 땅이 있고, 땅은 1 X 1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 오늘부터 인구 이동이 시작되는 날이다. 인구 이동은 아래와 같이 진행되고, 더 이상 인구 이동이 없을 때까지 지속된다. 1. 국경선을 공유하는 두 나라의 인구 차이가 L명 이상, R명 이하라면 두 나라가 공유하는 국경선은 오늘 하루 동안 연다. 2. 위의 조건에 의해 열어야 하는 국경선이 모두 열렸다면 인구 이동을 시작한다. 3. 국경선이 열려 있어 인접한 칸만을 이용해 이동할 수 있으면 그 나라를 오늘 하루 동안 연합이라고 한다. 4. 연합을 이루고 있는 각 칸의 인구수는 (연합의 인구수)..

Algorithm 2021.06.15

[Algorithm] 괄호 변환

코딩테스트 연습 - 괄호 변환 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 programmers.co.kr 풀이 먼저, 해당 문제는 시키는대로 잘 따라가면 된다. 순서대로 진행하는데, 균형잡힌 문자열과 올바른 문자열에 대해서 어떻게 판단할 것인지 생각해야한다. 균형 잡힌 문자열은 개수가 같은 것이기 때문에 '(' 와 ')'의 갯수가 동일한 경우의 index를 반환한다. 올바른 문자열은 '('와 ')'의 균형이 맞으면서 순서도 맞아야 한다. ')'이 먼저 나오는 경우 안된다. 나머지 부분은 문제에 정의된 부분대로 구현하면 되었다. class Solution { publi..

Algorithm 2021.06.14

[Algorithm] 연산자 끼워 넣기

풀이 연산자를 숫자 사이에 끼워넣는데, 순서 상관 없이 끼워넣어 모든 경우를 구하는 것과 같다. dfs로 구현했다. dfs를 구현할 때, 파라미터로 index와 지금까지 연산한 결과 now를 전달한다. dfs의 재귀호출의 깊이가 깊어질수록 number의 index는 n에 가까워지고 그때까지 연산의 결과를 유지해야 했다. index가 n에 도달하면 최대 최소 비교하도록 했다. 그리고 연산자의 경우 d 라는 배열로 관리했는데, 오히려 헷갈리기 때문에 깃헙의 풀이와 같이 각각의 변수로 관리하는 것이 코드를 보는데 더 편하다. 소스코드 import java.util.*; class Main { public static int n; public static int[] d = new int[4]; // 연산자 +,..

Algorithm 2021.06.13

[Algorithm] 감시 피하기

풀이 먼저, 벽이 3개인 경우를 찾아 선생님 위치에서 상하좌우를 확인하도록 생각했다. 1. 벽 설치 벽이 3개가 아닌 경우 벽을 설치하도록 dfs로 구현했다. 벽이 3개가 될 경우 그래프를 탐색하면서 선생님이 위치한 좌표를 찾아 체크한다. 선생님 수 만큼 체크가 되어야 한다. (모든 선생님이 학생을 못 봐야 함.) 여기서 선생님 한명만 안보여도 통과하게 로직을 짜서 문제가 되었다. public static void dfs(int cnt) { if (cnt == 3) { // 벽이 3개가 설치된 경우 int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (graph[i][j] == 'T') { // 선생님 위치에서 학생들..

Algorithm 2021.06.12
반응형