잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    
    public boolean solution(String[] phone_book) {
        Arrays.sort(phone_book);  //문자열을 정렬하면 사전순으로 정렬이 됨

		//i+1 위치의 문자가 i 위치의 문자로 시작하면 false 리턴
        for (int i = 0; i < phone_book.length - 1; i++) {
            if (phone_book[i+1].indexOf(phone_book[i]) == 0) return false;
        }
        
        //for문이 종료되면 그냥 true 리턴
        return true;
    }
}

 

정확성 테스트
테스트 1 통과 (0.26ms, 70.1MB)
테스트 2 통과 (0.27ms, 75.7MB)
테스트 3 통과 (0.27ms, 76.8MB)
테스트 4 통과 (0.21ms, 75MB)
테스트 5 통과 (0.23ms, 76.3MB)
테스트 6 통과 (0.29ms, 70.8MB)
테스트 7 통과 (0.21ms, 76.8MB)
테스트 8 통과 (0.16ms, 74.6MB)
테스트 9 통과 (0.25ms, 72.7MB)
테스트 10 통과 (0.23ms, 74.9MB)
테스트 11 통과 (0.21ms, 77.2MB)
테스트 12 통과 (0.22ms, 80MB)
테스트 13 통과 (0.25ms, 72.6MB)
테스트 14 통과 (2.47ms, 75.2MB)
테스트 15 통과 (3.37ms, 76.7MB)
테스트 16 통과 (2.86ms, 74.1MB)
테스트 17 통과 (3.29ms, 70.2MB)
테스트 18 통과 (5.81ms, 76MB)
테스트 19 통과 (4.50ms, 73.1MB)
테스트 20 통과 (5.60ms, 83MB)
효율성 테스트
테스트 1 통과 (18.05ms, 59.5MB)
테스트 2 통과 (17.98ms, 56.3MB)
테스트 3 통과 (417.88ms, 98.7MB)
테스트 4 통과 (327.33ms, 97.5MB)

 

 

 

 

 

엄청 간단한 문제였는데 해시 문제길래 해시를 써야하나 하고 계속 복잡하게 생각했었는데,

효율성 테스트 4번만 시간 초과가 계속 나와서 짜증났다가 순간 저게 생각이 나서 하니까 바로 통과했다...

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 리틀 프렌즈 사천성

리틀 프렌즈 사천성 언제나 맛있는 음식들이 가득한 평화로운 푸드 타운. 푸드 타운에서 행복하게 사는 리틀 프렌즈들은 마을에 있는 매직 스푼을 보물처럼 보관하고 있다. 매직 스푼은 재료만

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    char[][] table;
    HashMap<Character, MatchCard> list;
    public String solution(int m, int n, String[] board) {
        String answer = "";
        table = new char[m][n];
        list = new HashMap<>();
        
        for (int i = 0; i < board.length; i++) {
            table[i] = board[i].toCharArray();
        }
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (table[i][j] == '.' || table[i][j] == '*') continue;
                if (list.get(table[i][j]) != null) continue;
                
                for (int a = 0; a < m; a++) {
                    for (int b = 0; b < n; b++) {
                        if (i == a && j == b) continue;
                        
                        if (table[i][j] == table[a][b]){
                            list.put(table[i][j], new MatchCard(i, j, a, b));
                        }
                    }
                }
            }
        }

        ArrayList<Character> arr = new ArrayList<>();        
        while (list.size() > 0) {
            arr = new ArrayList<>();
            
            for (int i = 0; i < m; i++) {
            }
            for (char key : list.keySet()) {
                MatchCard card = list.get(key);
            
                boolean value = rootCheck(card.x1, card.y1, card.x2, card.y2);
                if (value) {
                    arr.add(key);
                }
                
            }
            
            if (arr.size() == 0) return "IMPOSSIBLE"; 
            
            Collections.sort(arr);
            char key = arr.get(0);
            MatchCard c = list.get(key);
            table[c.x1][c.y1] = '.';
            table[c.x2][c.y2] = '.';
            list.remove(key);
            answer += key;
        }
            
        return answer;
    }
    
    public boolean rootCheck(int x1, int y1, int x2, int y2) {
        if (x1 == x2) {
            if (holCheck(y1, y2, x1)) {return true;} else {return false;}
        }
        if (y1 == y2) {
            if (verCheck(x1, x2, y1)) {return true;} else {return false;}
        }
        
        if (verCheck(x1, x2, y1)) {
            boolean value = false;
            if (x1 < x2) {
                value = holCheck(y1, y2, x2) && cornerCheck(x2, y1);
            } else {
                value = holCheck(y1, y2, x1) && cornerCheck(x1, y1);
            }
            
            if (value) return true;
        }
        
        if (verCheck(x1, x2, y2)) {
            boolean value = false;
            if (x1 < x2) {
                value = holCheck(y1, y2, x1) && cornerCheck(x1, y2);
            } else {
                value = holCheck(y1, y2, x2) && cornerCheck(x2, y2);
            }
            
            if (value) return true;
        }
        
        return false;
    }
    
    public boolean cornerCheck(int x, int y) {
        if (table[x][y] == '.') return true;
        
        return false;
    }
    
    public boolean verCheck(int x1, int x2, int col) {
        if (x1 == x2) return true;
        
        if (x1 < x2) {
            for (int i = x1 + 1; i < x2; i++) {
                if (table[i][col] != '.') return false;
            }
            
        } else {
            for (int i = x1 - 1; i > x2; i--) {
                if (table[i][col] != '.') return false;
            }
        }
        
        return true;
    }
    
    public boolean holCheck(int y1, int y2, int row) {
        if (y1 == y2) return true;
        
        if (y1 < y2) {
            for (int i = y1 + 1; i < y2; i++) {
                if (table[row][i] != '.') return false;
            }
        } else {
            for (int i = y1 - 1; i > y2; i--) {
                if (table[row][i] != '.') return false;
            }
        }
        return true;
    }
}

class MatchCard {
    int x1, x2, y1, y2;
    
    public MatchCard(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
}

 

테스트 1 통과 (118.76ms, 112MB)
728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    public int[] solution(String s) {
        ArrayList<Integer> answer = new ArrayList<>();
        
        //제일 앞의 {{와 맨 뒤의 }}를 제외하고 },{로 구분
        String[] list = s.substring(2, s.length()-2).split("\\},\\{");
        
        //몇 개의 숫자로 구성되어 있는지 해당 길이로 오름차순 정렬
        Arrays.sort(list, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2) {
                String[] a1 = s1.split(",");
                String[] a2 = s2.split(",");
                
                return a1.length - a2.length;
            }
        });
       
      	//하나씩 돌려가면서 만약에  answer에 이미 담긴 숫자면 넘어가고 아니면 추가
        for (int i = 0; i < list.length; i++) {
            String[] temp = list[i].split(",");
            
            for (int j = 0; j < temp.length; j++) {
                int num = Integer.parseInt(temp[j]);
                if (answer.indexOf(num) == -1) answer.add(num);
            }
        }
        
        //int[]로 변환 후 리턴
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

테스트 1 통과 (3.40ms, 74.5MB)
테스트 2 통과 (8.10ms, 75.2MB)
테스트 3 통과 (3.30ms, 73.6MB)
테스트 4 통과 (3.10ms, 74.5MB)
테스트 5 통과 (11.48ms, 76.3MB)
테스트 6 통과 (12.07ms, 85.7MB)
테스트 7 통과 (41.08ms, 98.7MB)
테스트 8 통과 (151.94ms, 133MB)
테스트 9 통과 (62.32ms, 113MB)
테스트 10 통과 (120.71ms, 147MB)
테스트 11 통과 (150.36ms, 138MB)
테스트 12 통과 (271.85ms, 160MB)
테스트 13 통과 (177.02ms, 149MB)
테스트 14 통과 (239.11ms, 162MB)
테스트 15 통과 (3.18ms, 79.1MB)

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    boolean[] check; //방문 여부 체크용
    char[] list; //* + -가 들어있는 리스트
    long answer; //리턴용
    public long solution(String expression) {
        answer = 0;
        
       	//숫자들 모아놓을 배열
        ArrayList<Long> numbers = new ArrayList<>();
        //숫자 구분용
        String[] nTemp = expression.split("\\*|\\-|\\+");
        
        //숫자로 변환
        for (int i = 0; i < nTemp.length; i++) {
            numbers.add(Long.parseLong(nTemp[i]));
        }
        
        //연산기호 구분용
        char[] sTemp = expression.toCharArray();
       	
        //연산기호 담길 배열
        ArrayList<Character> sign = new ArrayList<>(); 
        
        //* + -면 추가
        for (int i = 0; i < sTemp.length; i++) {
            if (sTemp[i] == '*' || sTemp[i] == '+' || sTemp[i] == '-') {
                sign.add(sTemp[i]);
            }
        }
        
        check = new boolean[3];
        list = new char[]{'*', '+', '-'};
        
        //함수 호출
        func(numbers, sign);
        
        return answer;
    }
    
    public void func(ArrayList<Long> numbers, ArrayList<Character> sign) {
    	//다 계산 끝나면 숫자 하나만 남기 때문에 조건문이 이럼
        if (numbers.size() == 1 && sign.size() == 0) {
            //절대값으로 변환한 숫자와 answer와 비교해서 큰 쪽 담기
            answer = Math.max(answer, Math.abs(numbers.get(0)));
            return;
        } 
        
        //* + -을 for문으로 방문함
        for (int i = 0; i < list.length; i++) {
            if (check[i]) continue;
            
            check[i] = true;
            
            ArrayList<Long> numClone = (ArrayList<Long>) numbers.clone();
            ArrayList<Character> signClone = (ArrayList<Character>) sign.clone();
            
            while(signClone.indexOf(list[i]) != -1) {
                int p = signClone.indexOf(list[i]);
                
                long a = numClone.remove(p);
                long b = numClone.remove(p);
                signClone.remove(p);
                
                long c = (i == 0) ? a * b : (i == 1) ? a + b : a - b;
                numClone.add(p, c);
            }
            
            func(numClone, signClone);
            check[i] = false;
        }
    }
}

 

테스트 1 통과 (0.38ms, 75.3MB)
테스트 2 통과 (0.39ms, 72.9MB)
테스트 3 통과 (0.42ms, 76.3MB)
테스트 4 통과 (0.72ms, 75.1MB)
테스트 5 통과 (0.56ms, 68.5MB)
테스트 6 통과 (0.83ms, 75.3MB)
테스트 7 통과 (0.83ms, 71.6MB)
테스트 8 통과 (0.75ms, 74MB)
테스트 9 통과 (0.92ms, 71.4MB)
테스트 10 통과 (0.89ms, 73.1MB)
테스트 11 통과 (0.73ms, 75.4MB)
테스트 12 통과 (0.87ms, 73.6MB)
테스트 13 통과 (1.22ms, 74.3MB)
테스트 14 통과 (1.33ms, 91.1MB)
테스트 15 통과 (2.72ms, 72.3MB)
테스트 16 통과 (0.51ms, 69.9MB)
테스트 17 통과 (0.72ms, 77.8MB)
테스트 18 통과 (0.51ms, 74.5MB)
테스트 19 통과 (0.57ms, 74.4MB)
테스트 20 통과 (0.59ms, 87.8MB)
테스트 21 통과 (1.02ms, 72.8MB)
테스트 22 통과 (1.50ms, 76MB)
테스트 23 통과 (0.42ms, 75.1MB)
테스트 24 통과 (1.14ms, 69.6MB)
테스트 25 통과 (1.00ms, 73MB)
테스트 26 통과 (0.40ms, 72.7MB)
테스트 27 통과 (1.44ms, 74.2MB)
테스트 28 통과 (1.34ms, 73.3MB)
테스트 29 통과 (0.98ms, 71.8MB)
테스트 30 통과 (1.40ms, 76.4MB)

 

 

 

 

 

중요한 포인트는 split( )을 이용해서 *, +, - 를 구분해서 숫자만 골라낼 때 그냥 "*|+|-"가 아닌 "\\*|\\+|\\-"로 입력을 해야 함

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 거리두기 확인하기

[["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

 

 

 

 

 

import java.util.*;
class Solution {
    public int[] solution(String[][] places) {
        int[] answer = new int[places.length];
        
        //places 길이만큼 반복
        for (int i = 0; i < places.length; i++) {
            ArrayList<People> arr = new ArrayList<>(); //P점들이 담길 배열
            char[][] map = new char[5][5]; //5 * 5 배열
            answer[i] = 1; //일단 성공했다고 치고 1 넣어두기
            
            for (int j = 0; j < 5; j++) { //맵 넣는 과정
                char[] row = places[i][j].toCharArray();
                map[j] = Arrays.copyOf(row, 5);
                
                for (int m = 0; m < 5; m++) {  //넣을 값 중에 P가 있으면 배열에 추가
                    if (row[m] == 'P') {
                        arr.add(new People(j, m));
                    }
                }
            }
            
            //P 포인트들끼리 비교하기
            loop:
            for (int m = 0; m < arr.size(); m++) {
                People p1 = arr.get(m);
                int x1 = p1.x;
                int y1 = p1.y;
                
                for (int n = 0; n < arr.size(); n++) {
                    if (m == n) continue;
                    
                    People p2 = arr.get(n);
                    int x2 = p2.x;
                    int y2 = p2.y;
                    
                    //만약 거리가 2면 func함수로 넘기기
                    int num = Math.abs(x2 - x1) + Math.abs(y2 - y1);
                    if (num == 2) {
                        boolean value = func(map, x1, y1, x2, y2);
                        if (!value) {
                            answer[i] = 0;
                            break loop;
                        }
                    } else if (num < 2) { //거리가 2보다 작으면 그냥 바로 false로 실패 리턴
                        answer[i] = 0;
                        break loop;
                    }
                }
            }
        }
        return answer;
    }
    
    public boolean func(char[][] map, int x1, int y1, int x2, int y2) {
    	//포인터가 대각선에 있는지
        if (x1 != x2 && y1 != y2) {
            if (map[x1][y2] == 'O' || map[x2][y1] == 'O') return false;
        } else {
            if (x1 == x2) { //아니면 x나 y가 동일한지를 비교
                if (map[x1][Math.min(y1, y2) + 1] == 'O') return false;
            } else if (y1 == y2) {
                if (map[Math.min(x1, x2) + 1][y1] == 'O') return false;
            }
        }
        
        return true;
    }
    
}

class People {
    int x, y;
    public People(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

 

테스트 1 통과 (0.32ms, 74.3MB)
테스트 2 통과 (0.26ms, 76.4MB)
테스트 3 통과 (0.21ms, 76.7MB)
테스트 4 통과 (0.26ms, 76.2MB)
테스트 5 통과 (0.24ms, 72MB)
테스트 6 통과 (0.28ms, 75.3MB)
테스트 7 통과 (0.36ms, 73.7MB)
테스트 8 통과 (0.32ms, 78.4MB)
테스트 9 통과 (0.25ms, 74.6MB)
테스트 10 통과 (0.30ms, 74.2MB)
테스트 11 통과 (0.23ms, 81.6MB)
테스트 12 통과 (0.32ms, 74MB)
테스트 13 통과 (0.26ms, 76MB)
테스트 14 통과 (0.23ms, 76.2MB)
테스트 15 통과 (0.21ms, 73.2MB)
테스트 16 통과 (0.21ms, 83.4MB)
테스트 17 통과 (1.33ms, 74MB)
테스트 18 통과 (0.24ms, 80MB)
테스트 19 통과 (0.23ms, 69.2MB)
테스트 20 통과 (0.27ms, 65.9MB)
테스트 21 통과 (0.34ms, 72.8MB)
테스트 22 통과 (0.34ms, 76.1MB)
테스트 23 통과 (0.06ms, 73.6MB)
테스트 24 통과 (0.30ms, 78.6MB)
테스트 25 통과 (0.06ms, 75.5MB)
테스트 26 통과 (0.06ms, 76.6MB)
테스트 27 통과 (0.27ms, 72.1MB)
테스트 28 통과 (0.22ms, 77.6MB)
테스트 29 통과 (0.36ms, 77.7MB)
테스트 30 통과 (0.21ms, 74.9MB)
테스트 31 통과 (0.21ms, 77.1MB)

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    HashMap<String, Integer> aGroup, bGroup;
    public int solution(String str1, String str2) {
        aGroup = new HashMap<>();
        bGroup = new HashMap<>();
        
        char[] c1 = str1.toLowerCase().toCharArray();
        char[] c2 = str2.toLowerCase().toCharArray();
        String[] s1 = str1.toLowerCase().split("");
        String[] s2 = str2.toLowerCase().split("");
        
        for (int i = 0; i < c1.length-1; i++) {
            if (c1[i] < 97 || c1[i] > 122 || c1[i+1] < 97 || c1[i+1] > 122) continue;
            StringBuilder sb = new StringBuilder(s1[i]);
            sb.append(s1[i+1]);
            
            String s = sb.toString();
            aGroup.put(s, aGroup.getOrDefault(s, 0) + 1);
        }
        
        for (int i = 0; i < c2.length-1; i++) {
            if (c2[i] < 97 || c2[i] > 122 || c2[i+1] < 97 || c2[i+1] > 122) continue;
            StringBuilder sb = new StringBuilder(s2[i]);
            sb.append(s2[i+1]);
            
            String s = sb.toString();
            bGroup.put(s, bGroup.getOrDefault(s, 0) + 1);
        }
        
        int inter = 0;
        int outer = 0;
        for (String key : aGroup.keySet()) {
            int a = aGroup.get(key);
            outer += a;
            
            int b = bGroup.getOrDefault(key, 0);
            if (b == 0) continue;
            
            inter += Math.min(a, b);
        }
        
        for (String key : bGroup.keySet()) {
            int a = aGroup.getOrDefault(key, 0);
            int b = bGroup.get(key);
            
            if (b - a > 0) outer += (b - a);
        }
        
        double result = (inter == 0 && outer == 0) ? 65536 : (double) inter / outer * 65536;
        return (int) result;
    }
}

 

테스트 1 통과 (0.30ms, 72.7MB)
테스트 2 통과 (0.25ms, 76.9MB)
테스트 3 통과 (0.20ms, 72.2MB)
테스트 4 통과 (3.23ms, 76.4MB)
테스트 5 통과 (0.30ms, 73.8MB)
테스트 6 통과 (0.19ms, 76.8MB)
테스트 7 통과 (0.61ms, 73.3MB)
테스트 8 통과 (0.22ms, 73.6MB)
테스트 9 통과 (0.60ms, 75MB)
테스트 10 통과 (1.11ms, 75.1MB)
테스트 11 통과 (1.58ms, 75.5MB)
테스트 12 통과 (0.16ms, 71.5MB)
테스트 13 통과 (0.49ms, 76.4MB)

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int[] arrival = new int[N+1];  //스테이지별 도달한 플레이어 수
        int[] noClear = new int[N+1];  //스테이지별 클리어하지 못한 플레이어 수
        
        //도달한 플레이어 수 구하기
        //stages[j](멈춰있는 스테이지)가 i(스테이지 레벨)보다 크거나 같으면 +1
        for (int i = 1; i <= N; i++) { 
            for (int j = 0; j < stages.length; j++) {
                if (stages[j] >= i) arrival[i]++; 
            }
        }
        
        //도달은 했지만 클리어하지 못한 플레이어 수 구하기
        //stages[i]의 해당 스테이지 +1
        for (int i = 0; i < stages.length; i++) {
            if (stages[i] > N) continue;
            noClear[stages[i]]++;
        }
        
        //해시맵에 스테이지와 해당 스테이지의 실패율 저장
        HashMap<Integer, Double> map = new HashMap<>();
        for (int i = 1; i <= N; i++) {
            if (arrival[i] == 0)
                map.put(i, (double) 0);
            else 
                map.put(i, (double) noClear[i] / arrival[i]);
                
        }
        
       	//실패율(내림차순)로 정렬
        //실패율이 동일하면 스테이지 레벨이 작은 것이 앞으로 오게(오름차순) 정렬
        List<Map.Entry<Integer, Double>> arr = new ArrayList<Map.Entry<Integer, Double>>(map.entrySet());
        Collections.sort(arr, new Comparator<Map.Entry<Integer, Double>>(){
            @Override
            public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) {
                double v1 = o1.getValue();
                double v2 = o2.getValue();
                
                if (v1 < v2) {
                    return 1;
                } else if (v1 == v2) {
                    if (o1.getKey() > o2.getKey()) {
                        return 1;
                    }
                }
                
                return -1;
            }
        });
        
        for (int i = 0; i < arr.size(); i++) {
            answer[i] = arr.get(i).getKey();
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.50ms, 73.7MB)
테스트 2 통과 (0.68ms, 80.5MB)
테스트 3 통과 (23.97ms, 93.4MB)
테스트 4 통과 (84.02ms, 92.1MB)
테스트 5 통과 (323.87ms, 86.4MB)
테스트 6 통과 (4.55ms, 82.7MB)
테스트 7 통과 (9.45ms, 88.4MB)
테스트 8 통과 (102.62ms, 87.6MB)
테스트 9 통과 (295.23ms, 88.3MB)
테스트 10 통과 (47.49ms, 81.1MB)
테스트 11 통과 (98.49ms, 94.1MB)
테스트 12 통과 (47.03ms, 84.7MB)
테스트 13 통과 (86.05ms, 100MB)
테스트 14 통과 (0.49ms, 70.3MB)
테스트 15 통과 (20.82ms, 78.3MB)
테스트 16 통과 (8.20ms, 85.4MB)
테스트 17 통과 (12.28ms, 79.9MB)
테스트 18 통과 (5.29ms, 74.5MB)
테스트 19 통과 (2.36ms, 77.1MB)
테스트 20 통과 (10.64ms, 74.1MB)
테스트 21 통과 (8.66ms, 89.8MB)
테스트 22 통과 (147.99ms, 111MB)
테스트 23 통과 (17.61ms, 92.1MB)
테스트 24 통과 (18.99ms, 92.1MB)
테스트 25 통과 (0.52ms, 78.9MB)
테스트 26 통과 (0.50ms, 77.6MB)
테스트 27 통과 (0.49ms, 79.9MB)

 

 

 

 

 

이게 1단계..?

문제를 풀면서 주의해야할 점은 도달한 플레이어 수가 0인 스테이지는 실패율을 0으로 제대로 처리해야 한다

직접 값을 입력하지 않으면 0으로 나누는 것이 되기 때문에 오류가 뜨기 때문이다.

 

 

 

 

 

 

728x90
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    public String solution(String p) {
        return func(p); //func함수 자체가 String을 리턴하기 때문에 바로 리턴
    }
    
    public String func(String word) {
        if (word.equals("")) return ""; //만약 빈 문자열이면 그대로 리턴함
        
        //문자열을 붙이는 작업이 많기 때문에 시간 절약을 위해 StringBuilder 객체 선언하여 활용
        StringBuilder result = new StringBuilder();
        
        int position = 0; //u와 v를 구분하기 위한 위치를 담을 변수
        int count = 0; //균형잡힌 문자열을 알아내기 위해서 사용하는 변수
        String[] s = word.split("");
        
        //올바른 문자열인지 아닌지를 구분하기 위한 변수
        //만약 시작이 "("이면 올바른 문자열이고, 그렇지 않으면 아닌 것
        boolean value = s[0].equals(")") ? false : true; 
        
        for (int i = 0; i < s.length; i++) {
            count += (s[i].equals("(")) ? 1 : -1; //만약 s[i]가 "("면 +1을 아니면 -1을 함
            if (count == 0) { 
            	//괄호의 모양에 따라 +1 또는 -1 하면서 0이 되는 순간이 있음
                //그 순간이 괄호 숫자가 딱 떨어지는 순간이기 때문에 여기서 잘라야 함
                position = i + 1;
                break;
            }
        }
        
        String u = word.substring(0, position);
        String v = word.substring(position, word.length());
        
        if (value) { //올바른 문자열일 때
            result.append(u);
            result.append(func(v));
        } else { //올바른 문자열이 아닐 때
            result.append("(");
            result.append(func(v)); //v는 다시 처음부터 반복해서 리턴해야 하기 때문에 함수 호출
            result.append(")");
            
            char[] uSplit = u.substring(1, u.length()-1).toCharArray(); //앞 뒤 제외하고 배열 만들기
            
            for (int i = 0; i < uSplit.length; i++) { //괄호 뒤집기
                uSplit[i] = uSplit[i] == '(' ? ')' : '(';
            }

            result.append(new String(uSplit));
        }
        
        return result.toString(); //리턴값이 String이기 때문에 toString() 필수
    }
}

 

테스트 1 통과 (0.21ms, 80.9MB)
테스트 2 통과 (0.14ms, 78.8MB)
테스트 3 통과 (0.11ms, 72.7MB)
테스트 4 통과 (0.20ms, 71MB)
테스트 5 통과 (0.22ms, 76.5MB)
테스트 6 통과 (0.16ms, 73.8MB)
테스트 7 통과 (0.29ms, 73.6MB)
테스트 8 통과 (0.20ms, 77MB)
테스트 9 통과 (0.32ms, 77.2MB)
테스트 10 통과 (0.26ms, 77.6MB)
테스트 11 통과 (0.80ms, 76.2MB)
테스트 12 통과 (1.38ms, 74.5MB)
테스트 13 통과 (1.96ms, 73.7MB)
테스트 14 통과 (3.80ms, 70.1MB)
테스트 15 통과 (3.40ms, 74.3MB)
테스트 16 통과 (12.50ms, 85.6MB)
테스트 17 통과 (5.09ms, 76.5MB)
테스트 18 통과 (11.14ms, 82.8MB)
테스트 19 통과 (21.54ms, 89.8MB)
테스트 20 통과 (20.80ms, 84.5MB)
테스트 21 통과 (5.69ms, 76MB)
테스트 22 통과 (4.01ms, 80.6MB)
테스트 23 통과 (41.25ms, 91.5MB)
테스트 24 통과 (4.12ms, 75.4MB)
테스트 25 통과 (9.37ms, 74.4MB)

 

 

 

 

 

문제에서 재귀적으로 수행하라길래 진짜 재귀함수로 풀었음.

 

 

 

 

 

728x90

+ Recent posts