본문 바로가기

Algorithm/Practice

(81)
Programmers - 110옮기기 with JAVA 문제 1과 0으로 이루어진 문자열에서 "110"들을 찾고 나머지 수와 "110"들을 합쳐 가장 작은 수를 만들어라 로직 1. 모든 "110"을 찾는다. -> 이 때, Stack을 이용해 한번의 반복에 모든 "110" 을 찾아야 시간복잡도가 충족된다. 2. 뒤에서 부터 가장 가까운 0을 찾고 모든 "110"을 해당 0 뒤에 붙여주어 가장 작은 숫자를 만든다. -> 항상, 0이 앞에 있을 수록 작기 때문이다. 코드 import java.util.*; class Solution { public List solution(String[] s) { List answer = new ArrayList(); for(String now : s){ if(now.length() =0; i--){ if(now.charAt(i)..
Programmers - 양과 늑대 with JAVA 로직 - DFS 위와 같은 상황이 있다고 가정하자. dfs의 시작은 노드번호 0부터 시작한다. 1 : 0번 방문) next = {1, 8}, 양 = 1, 늑대 = 0 2 : 0-1번 방문) next = {8, 2, 4}, 양 = 2, 늑대 = 0 3 : 0-8번 방문) next = {1, 7, 9}, 양 = 1, 늑대 = 1 -> 하지만 양과 늑대 수가 같아지므로 제외됨. 4 : 0-1-8번 방문) next = {2, 4, 7, 9} 양 = 2, 늑대 = 1 ... 즉, 방문마다 다음 방문할 노드로 해당 노드의 자식 노드들은 추가하되, 형제 노드도 추가해주면서 DFS를 돌리는 방식으로 이 문제를 해결할 수 있다. 코드 import java.util.*; class Solution { public stat..
Programmers - 길 찾기 게임 with JAVA (V) 기본 개념 -> 기본적으로 루트노드의 위치에 따라 중위, 전위, 후위 순회이다. 왼쪽, 오른쪽은 고정 1. 중위 순회 (inorder) : 왼쪽 서브 트리 -> 루트 노드 -> 오른쪽 서브 트리 순으로 방문 (가장 루트 노드에서 시작해 더이상 왼쪽 서브트리가 없을때 해당 노드를 방문처리 -> 그 노드의 루트 노드 -> 오른쪽 서브 트리 동일 처리) 방문 순서 : F -> B -> A(방문) -> B(방문) -> D -> C(방문) -> D(방문) -> E(방문) -> F(방문) -> G(방문) -> I -> H(방문) -> I(방문) 결과 : A - B - C - D - E - F - G -H - I 2. 전위 순회 (preorder) : 루트 노드 -> 왼쪽 서브 트리 -> 오른쪽 서브 트리 방문 순서..
Programmers - 외벽점검 with JAVA (V) 로직 1. DIst의 조합을 구한다. 2. 새로운 Weak 생성 - N 범위 넘어가거나 뒤로가는 경우를 묶기위함. 3. 기존의 weak의 위치에서 출발해 weak의 길이만큼 점검시 종료 예시 weak = [1, 2, 3, 4] , n = 10 new_weak = [1, 2, 3, 4, 11, 12, 13, 14] - 1부터 출발 [1, 2, 3, 4] 모두 검사 가능한지 체크 - 2부터 출발 [2, 3, 4, 11] 모두 검사 가능한지 체크 4. 친구의 수가 부족하다면 늘려서 가장 적게 친구를 사용할때가 정답 코드 import java.util.*; class Solution { public static List check = new ArrayList(); public int solution(int n,..
Programmers - 교점에 별 만들기 with JAVA 로직 및 고찰 우선 아이디어는 선마다 교점을 구하고 그것을 그래프로 표현했다. 선의 수는 최대 1000개로 약 50만회? 정도면 모두 구할 수 있기에 아이디어의 시간복잡도는 충분하다. 나는 아래의 두가지 오류가 발생했었다. 메모리 초과 오류 - Double.MAX_VALUE, MIN_VALUE로 처리시 모든 좌표들에 대해 원활환 처리가 되지 않았다. 따라서 그냥 첫번째 인덱스를 기준으로 처리하는게 깔끔한 것 같다. 범위 초과 - A,B,C의 범위는 10만 이하이다. 따라서 A*B시에 백억?까지 범위가 올라갈 수 있다. 따라서 long 변수에 더하고 곱하던가 모든 int를 long으로 처리 후 계산을 해야 범위가 초과되지 않는다. 코드 import java.util.*; class Solution { //..
Programmers - 보행자 천국 with JAVA 로직 (DP) 기본적인 로직은 다음과 같다. 1. 위와 왼쪽 블록을 값을 확인해 조건에 맞게 더해준다. 2. 위 또는 왼쪽 블록이 막혀있다면 0을 더해준다. 만약 회전 불가 칸이라면 위쪽을 조사하고 있다면 그 바로 위의 값을 다시 확인, 왼쪽도 마찬가지로 그 왼쪽 칸을 다시 확인한다. 3. 결과 도출 오류가 발생했었다. 기존의 코드 -> 주어진 Map의 1과 2를 -1과 -2로 바꾸고 주어진 해당 Map에 DP 적용 변경 코드 -> 새로운 Map을 생성해 동일 로직 처리 오류가 발생한 원인은 찾지 못했다. 일단은 앞으로 새로운 맵을 만들어서 사용하는 것이 맞을 것 같다. 코드 - 틀린 코드 class Solution { public static int MOD = 20170805; public int so..
Programmers - 광고 삽입 with JAVA 로직 1. 전체 재생시간 및 광고 재생시간을 초로 변경한다. 2. 사람들의 로그마다 시작시간 이상 종료시간 미만으로 누적합을 구한다. 3. 0초에 광고 틀었을 때, 시청 수부터 최대한 광고를 늦게 틀었을 때 까지 최대 광고 시청수를 갱신할 때마다 정답을 갱신해준다. (인덱스가 낮을수록 정답이기 때문에 기록할 필요 없음) 4. 정답을 시간으로 다시 표현 후 반환 틀렸던 점 1. 문제를 100퍼센트 읽지 않았다. 로그마다 실행시간은 시작시간이상 종료시간 미만임을 인지 못했다. 2. 누적 시청시간을 초단위로 구하게 되면 범위가 long으로 설정해야한다 -> 테스트 케이스 17번 3. 누적합 로직을 잘 구현하자. -> answer = i로 설정하는 실수를 하였는데 실수하지 말자. 코드 class Solution..
Programmers - 인사고과 with JAVA 로직 편하게 점수를 A, B라고 하자. 조건에서는 현재 자신의 점수보다 A, B 둘다 높은 점수가 있다면 탈락이다. 예시 : (7, 1), (6, 2), (3, 2), (3, 1), (2, 2), (2, 1) 1. A를 내림차순으로 정렬한다. -> 앞에 있을수록 A점은 뒤에보다 높다. -> 따라서 항상 B점은 앞에보다 높아야한다. A : 7, 6, 3, 3, 2, 2 B : 1, 2, 2, 1, 2, 1 -> 이렇게 된다면 (3, 2), (3, 1)과 같이 A점이 같은 경우에 (3, 1)의 경우 앞에 있는 수들과 B점을 비교해야 한다. => 현재 점수의 A점은 앞에 A보다 작거나 같고 B점은 모른다. 2. A가 같다면 B를 오름차순으로 정렬한다. A : 7, 6, 3, 3, 2, 2 B : 1, 2, 1..