Algorithm/풀이 회고 16

[Programmers/Kotlin] 조이스틱 (브루트포스 풀이, 오히려 빠르다?)

[도입] 아마 프로그래머스에서 코딩테스트 준비해본 사람 중 이 문제 모르는 사람 없을 것 같다. 고득점 Kit 의 그리디 편에 수록된 문제이다. 나는 그리디로 풀려고 노력하다가 시간이 너무 오래걸려서 일단 브루트포스로 풀어보았다. (그리디 방법을 모색할 때마다 반례를 찾아서.. 그리디를 통과하는 코드를 찾아서 뭔지 묵혀두고 공부해야겠다.) 브루트포스로 이 문제를 푼다고했을 때, 이 문제의 핵심은 A가 아닌 모든 알파벳의 위치를 방문하는 최소의 움직임 수라고 생각한다. 왜냐하면 알파벳을 바꾸는 것은 +- 연산만으로도 충분하고 따로 작업할 수 있기 때문이다. 이 문제 브루트포스로 풀면 시간초과 나지 않냐? 고 하시는 분을 위해 말씀드리자면 name 의 길이가 최대 20(N 이라 하자)이라 가능하다고 본다. ..

[Programmers/Kotlin] 여행 경로 (DFS)

[도입] 오랜만에 괜찮다고 생각되는 문제를 만나서 글을 작성하게된다. 문제는 굉장히 간단하다. 출발공항, 도착공항 쌍으로 이루어진 티켓들이 주어지는데, 이 티켓을 모두 사용(이게 이 문제의 핵심이다.)하는 공항경로를 만드는 문제이다. 공항을 정점이라고 했을 때, 보통 정점을 모두 방문하는 문제를 많이 풀어본 사람으로서 (그래서 BFS, DFS 시 정점을 위주로 방문여부를 확인) 좀 당황했었다. 문제에 대한 자세한 내용은 아래를 참고한다. 코딩테스트 연습 - 여행경로 [["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] programmers...

[Kotlin/프로그래머스] 다리를 지나는 트럭

[문제소개] 트럭을 1칸, 다리를 N (문제의 bridge_length) 칸이라고 했을 때 각 트럭 무게와 다리 무게제한을 고려하여 모든 트럭이 지나가는 데 걸리는 초를 구하는 문제 코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 programmers.co.kr [나의 풀이] 일단 매 초마다 루프를 돌면서 각 반복마다 일차원 조회를 하면 O(N^2) 이고 N 이 10000이므로 시간초과가 날 가능성 때문에 O(N) 으로 풀 수 있는 방법을 고민했다. 그렇다 해도 입력에 따라 결과가 달라지고 경우의 수도 많으므로 시..

[Kotlin/프로그래머스] 거리두기 확인하기 (2021 카카오 채용연계형 인턴십)

코딩테스트 연습 - 거리두기 확인하기 [["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1] programmers.co.kr [문제 소개] 1. 5 * 5 이차원 배열의 대기실이 주어졌을 때 2. 맨해튼 거리로 2 이하가 되게 사람이 존재해서는 안된다는 거리제한 조건 3. 단, 벽이 존재하여 상하좌우 4방향 기준으로..

[Kotlin/프로그래머스] 콜라츠 추측

요즘 코틀린의 문법에 빠르게 익숙해지기 위해 프로그래머스 Level 1 부터 문제를 풀어보고 있다. 알고리즘 풀다가 자주 마주하는 Int 오버플로우 문제가 나와서 실수하지 않기 위해서 글을 작성한다. 문제 소개 정수가 하나 주어지면 아래와 같은 과정을 거쳐서 1이되는데 몇번이나 그 과정을 거쳐야하는지 반환하는 문제이다. ( 자세한 문제 내용은 아래 링크에서 확인 ) 1-1. 입력된 수가 짝수라면 2로 나눕니다. 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. https://programmers.co.kr/learn/courses/30/lessons/12943 코딩테스트 연습 - 콜라츠 추측 1937년 Collatz란 사람에 의해 ..

[Java/프로그래머스] 압축

https://programmers.co.kr/learn/courses/30/lessons/17684 /* * 2021.07.02 * PGM 압축 https://programmers.co.kr/learn/courses/30/lessons/17684 * 일단 HashMap로 단어와 색인번호를 저장해야겠다. * A-Z까지 1~26으로 초기화 * w찾고 색인번호 출력, 다음글자 붙여서 사전에 등록 * 그냥 시키는대로 했더니 풀린다. */ import java.util.*; class Solution { static int idx; static int len; public int[] solution(String msg) { idx = 1; HashMap dic = new HashMap(); for(char c ..

[Java/프로그래머스] 방금그곡

https://programmers.co.kr/learn/courses/30/lessons/17683# 코딩테스트 연습 - [3차] 방금그곡 방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, programmers.co.kr /* * 2021.07.02 * PGM 방금그곡 https://programmers.co.kr/learn/courses/30/lessons/17683# * 정규식을 이용하면 쉬운문제 였다. 문자하나가 음하나라고 인식하는 오류를 범해서 시간이 오래걸렸다. * 문자두개가 음 하나가 될 수 있다. * 여기서 시간이든(이 문제에서는 분단위로), 문자열이든..

[Java/프로그래머스] 순위검색 (시간초과 해결)

https://programmers.co.kr/learn/courses/30/lessons/72412 0 && list.get(0) >= score) answer[i] = binarySearch(list, score, 0, len-1); else //길이가 0이거나 오름차순이니 첫번째 숫자가 가장큰데 그게 기준점수보다 작다면 답은 0이다. answer[i] = 0; } return answer; } /* * 이분탐색 함수 * 일반적인 이분탐색과는 다른 점이, 딱 찾는 게 아니라 기준 점수보다 큰 최소점수를 찾아야한다. * 범위가 일정 길이 이하가 되면 liear search로 찾아준다. * @param : ArrayList 쿼리에 해당하는 점수들이 담긴 리스트 (내림차순임에 주의) * @param : s..

[Java/프로그래머스] 프렌즈4블록 (10번 케이스 해결)

https://programmers.co.kr/learn/courses/30/lessons/17679# 코딩테스트 연습 - [1차] 프렌즈4블록 프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙 programmers.co.kr 문제설명은 위 링크에서 확인가능, 10번 케이스에 대한 설명은 설명에 있다. 나에게 이 문제의 교훈은 모든 케이스를 다 고려해서 알고리즘을 작성해야한다는 것이다. 나는 이 문제가 구현 시뮬레이션 문제라고 해석했다. 2차원 char배열로 만들고 탐색과 내리기를 반복하다가, 탐색했는데 더이상 지울 것이 없다면 답을 구한다. 0~m-1과 0~..

[Java/프로그래머스] 괄호 변환

/* * 2021.06.28 * PGM 괄호 변환 https://programmers.co.kr/learn/courses/30/lessons/60058 * 개수만 맞으면 균형잡힌이고, 짝도 맞아야 올바른임 * 균형만잡힘 => 올바른 변환 * 일단 균형인지아닌지, 올바른인지 아닌지 판단하는 함수 두 개 만들자 * u와 v를 분리하기 위해 u를 찾는 함수도 만들자 */ import java.util.*; class Solution { public String solution(String p) { if(isPerfect(p)) return p; String answer = makePerfectBracket(p); return answer; } static String makePerfectBracket(Stri..