코딩테스트/Java 109

(2018카카오) 자물쇠와 열쇠 Java

Lock의 약 3배크기의 그리드를 준비한다. Lock을 그리드의 중앙으로 복사한다. Key값을 각각의 Lock의 꼭짓점부터 순회한다. 더불어 Key를 회전(rotate)시키면서 탐색한다. 탐색할시에 Lock위치에 해당하는 인덱스의 값이 모두 1이어야 Lock이 딱 맞는걸로 판별된다. 위의 그림처럼 키의값이 겹치면 1이 아닌것을 return하게 된다. dfs방식 : boolean isOk값을 true냐 false냐로 판단한다. public void dfs(int[][]key, int [][] lock, int cnt) { check(key, lock, 0, 0); if(isOk) return; if(cnt >= 4) return; int[][] temp = rotate(key);//키회전시킨걸로 탐색 df..

[Java] 자바 진수변환 알고리즘

10진수->2/8/16진수 Integer.toBinaryString(바꿀문자열); Integer.toOctalString(바꿀문자열); Integer.toHexString(바꿀문자열); int i = 127; String binaryString = Integer.toBinaryString(i); //2진수 String octalString = Integer.toOctalString(i); //8진수 String hexString = Integer.toHexString(i); //16진수 System.out.println(binaryString); //1111111 System.out.println(octalString); //177 System.out.println(hexString); //7f 2/8/..

(2018카카오) n진수 게임 Java

실제로 존재하는 술게임이다..;; 진수변환에 관한 문제이다. 10~15는 각각 대문자 A~F로 출력한다. String[] alphaForMoreThanTen = {"A","B","C","D","E","F"}; 위와 같이 ABCDEF 사전을 만들어놓고, 아래와 같이 나머지값이 10~15인 값에 대하여 대체텍스트를 대입한다. if(remain>=10&&remain=10&&remain2/8/16진수 Integer.toBinaryString(바꿀문자열); Integer.toOctalString(바꿀문자열); Integer.toHexString(바꿀문자열); int i = 127; String binaryString = Integer.toBinaryString(i); //2진수 Strin.. skmouse.tis..

(2018카카오) 추석 트래픽 Java

Date의 형식을 맞춰서 비교하는 방법은 아래 글을 참고하면된다. readystory.tistory.com/55 [JAVA] Date to String / String to Date 변환(SimpleDateFormat) 프로그래밍을 하다 보면 시간이나 날짜를 사용할 일이 많은데, 아마 대부분 Date 클래스를 사용했을 겁니다. 예를 들어 현재 시간을 가져오는 코드는 다음과 같습니다. import java.util.Date; public class readystory.tistory.com 단, parse() 메소드의 경우 ParseException을 던져주기 때문에 그에 대한 처리가 필요함. 중복for문을 이용한 방법 import java.text.ParseException; import java.text..

(2018카카오) 압축 LZW 알고리즘 Java

LZW(Lempel–Ziv–Welch) 압축 : LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다. String 문자열 탐색 기반 문제이다. dictionary를 map으로 만들어서 실행한다. Ascii코드의 알파벳 대문자 값을 이용하여 dictionary를 생성했다. 아래는 필자의 코드이다. import java.util.ArrayList; import java.util.HashMap; import java.util.Map; class Solution { public int[] solution(String msg) { ArrayList list = new ArrayList(); int num = 1;//add index Map map = new Ha..

(2018카카오) 후보키 Java

일반적인 탐색문제이다..DFS방식도 있지만 완전탐색이 더 실행속도 측면에서 빨랐다. 하지만 Bit Mask방식으로 For문으로 경우의수를 나눠서 풀 수 있다. BitMask방식은 이진법을 이용하여 0=000(2) ~ 15=111(2) 으로 001, 010, 011, ... , 110, 111 방식으로 https://keepgoing0328.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B3%B5%EC%B1%84-%ED%9B%84%EB%B3%B4%ED%82%A4-%EC%9E%90%EB%B0%94-bitmask [ 프로그래머스 - 2019 카카오 공채 ] 후보..

(2018카카오) 캐시 LRU(Least Recently Used) 알고리즘 Java

위 문제는 LRU(Least Recently Used)알고리즘을 이용한 방법이다. 대표적인 LRU 알고리즘의 문제로 꼽힌다. 사진출처: gomguard.tistory.com/115 페이지 교체 알고리즘 - LRU 페이지 교체 알고리즘 사회의 자원은 한정되어 있고 그 한정된 자원을 효율적으로 사용하기 위해 각종 법과 규칙이 존재합니다. 눈에 확연히 보이지 않아 무한할 것만 같은 컴퓨터 자원도 사실 gomguard.tistory.com 해쉬맵을 이용한 코드다. 코드는 길지만, 실행속도는 빠른편이다. 여기서도 toLowerCase()로 소문자로 모두 변환해주었다. 각 상황을 if문에 따라 나누었는데, cacheSize=0인경우를 고려하지않았었는데, 개인적으로 문제를 꼼꼼히 읽어야겠다는 생각을 했다. impor..

(2018카카오) 뉴스 클러스터링 Java

일반적인 중복이 없는 교집합/합집합 문제였으면 쉽게 풀렸을텐데(HashMap,Set이용) 까다로운 조건이 추가되어 애매한 교집합/합집합 문제였다. 기획안 /* 0. 대문자=>소문자로 일괄 변환해버린다. 1. str 2개씩 쪼개기 2. 쪼개면서 영문자가 아닌 문자들은 제외. 3. 쪼갠건 Queue에 넣어놓는다.(x) -> q1,q2로 카운팅으로 대체 4. 2개의 Map에 key, 중복포함개수(value) 저장 5. Map의 key에 따라서 중복된 key값이 있으면 value값을 비교. => 두 map에 같은 key값이 있는경우, 각 중복원소에따른 value카운트값을 queue에 넣는다. 7.1 (A+B) - (AnB) = AuB 값 7.2 (AnB) / (AuB) * 65536 = answer */ 1. ..

(2020카카오) 튜플 Java

각 문자열에 대하여 숫자를 추출해서 넣는다 각 숫자에 대하여 몇번 나왔는지 카운팅 해서 카운트가 높을수록 먼저 출력된다(우선순위 上) 그래서 떠오른 것이 Map, Set을 이용하여 각 문자열("111" , "22")에 대하여 Integer로 카운팅한값을 묶어서 증가시키는 방법으로 진행하였다. import java.util.*; class Solution { public int[] solution(String s) { Map map = new HashMap(); String numStr = ""; for (int i = 2; i < s.length(); i++) {//0번째랑 마지막 괄호 제외 if(s.charAt(i) == '{' || s.charAt(i) == '}' || s.charAt(i) == '..

(2020카카오) 괄호변환 Java

문제가 내용이 괴랄해서 아래의 영상설명을 참조했다 www.youtube.com/watch?v=Bc34h7xPTL8 어려운 문제중에서 이런식으로 코드 메뉴얼을 주는 경우, 그대로 따라 구현하기만하면 반은 성공할 수 있다고 본다. 그리고 프로그래머스에서 solution메소드를 직접 재귀로 돌리는 방법이 포함되어있으니 참고해보는게 좋겠다. 분할정복 문제에 해당한다. 분할정복법은 주어진 문제를 작은 사례로 나누고(Divide) 각각의 작은 문제들을 해결하여 정복 (Conquer)하는 방법이다. 분할정복법은 문제의 사례를 2개 이상의 더 작은 사례로 나눈다. import java.util.*; class Solution { int pos; boolean isCorrect(String str){ boolean re..