잡다한 배똥월드

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

 

https://programmers.co.kr/learn/courses/30/lessons/12948?language=kotlin 

 

 

 

 

 

 

class Solution {
    fun solution(phone_number: String): String {
        var answer = "";
        
        var size = phone_number.length;
        for (num in 1..size-4) {
            answer += "*";
        }
        
        answer += phone_number.substring(size-4, size);
        
        return answer;
    }
}

 

테스트 1 통과 (2.09ms, 62.2MB)
테스트 2 통과 (2.00ms, 64MB)
테스트 3 통과 (8.47ms, 62.2MB)
테스트 4 통과 (2.51ms, 62.3MB)
테스트 5 통과 (2.05ms, 63.4MB)
테스트 6 통과 (2.67ms, 63.3MB)
테스트 7 통과 (2.97ms, 62.5MB)
테스트 8 통과 (2.84ms, 61.9MB)
테스트 9 통과 (1.27ms, 63.7MB)
테스트 10 통과 (1.86ms, 65.1MB)
테스트 11 통과 (1.82ms, 63.1MB)
테스트 12 통과 (1.92ms, 64.6MB)
테스트 13 통과 (1.96ms, 62.7MB)

 

 

 

 

 

split으로 한 칸씩 잘라서 배열 만든 후에 for문으로 번호 길이 - 4까지 *으로 바꾼 후에 joinToString으로 배열을 String으로 합친 후에 리턴하면 될 것 같다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        
        ArrayList<Queue<Integer>> map = new ArrayList<>();
        
        for (int i = 0; i < board.length; i++) {
            Queue<Integer> q = new LinkedList<>();
            
            for (int j = 0; j < board[i].length; j++) {
                if (board[j][i] == 0) continue;
                
                q.add(board[j][i]);                
            }
            
            map.add(q);
        }
        
        Stack<Integer> s = new Stack<>();
        
        for (int i = 0; i < moves.length; i++) {
            Queue<Integer> q = map.get(moves[i]-1);
            if (!q.isEmpty()) {
                int num = q.poll();
                int sNum = (!s.empty()) ? s.peek() : -1;
                
                if (sNum != -1 && num == sNum) {
                    s.pop();
                    answer += 2;
                } else {
                    s.push(num);
                }
            }
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.27ms, 79.9MB)
테스트 2 통과 (0.24ms, 74.4MB)
테스트 3 통과 (0.27ms, 83.6MB)
테스트 4 통과 (2.65ms, 72MB)
테스트 5 통과 (0.24ms, 78.3MB)
테스트 6 통과 (0.38ms, 75.8MB)
테스트 7 통과 (0.36ms, 77MB)
테스트 8 통과 (1.08ms, 83.7MB)
테스트 9 통과 (0.68ms, 77.8MB)
테스트 10 통과 (0.82ms, 72.3MB)
테스트 11 통과 (1.02ms, 75.2MB)

 

 

 

 

 

board에 들어 있는 블록을 세로 한 줄씩 정리할건데, 위에서부터 정의되어 있어서 제일 먼저 들어간 것을 꺼내는 Queue를 이용하여 정리했음.

 

 

 

 

정리한 Queue들은 ArrayList로 묶어서 map을 만들었고, moves 배열에서 하나씩 꺼내오면서 제일 마지막에 넣는 것을 꺼내는 스택으로 블록을 하나씩 넣는데, 만약 제일 위에 있는 것이 넣을 것과 같으면 스택 맨 마지막에 넣은 값을 없애고 answer에 +2를 하는 것으로 코드를 짰다.

 

 

 

 

더보기

지난번에 작성한 코드

 

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        
        Stack stack = new Stack();
        
        int answer = 0;
        
        for (int i = 0; i < moves.length; i++){
            int num = moves[i] - 1;
            for (int j = 0; j < board.length; j++){
                if (board[j][num] != 0){
                    if (stack.size() != 0 && (int)stack.peek() == board[j][num]){
                        stack.pop();
                        answer += 2;
                    } else {
                        stack.push(board[j][num]);
                    }
                    
                    board[j][num] = 0;
                    break;
                    
                }
            }
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.18ms, 53MB)
테스트 2 통과 (0.13ms, 77.2MB)
테스트 3 통과 (0.19ms, 52.1MB)
테스트 4 통과 (1.31ms, 52.2MB)
테스트 5 통과 (0.18ms, 52.1MB)
테스트 6 통과 (0.18ms, 53.3MB)
테스트 7 통과 (0.30ms, 52.2MB)
테스트 8 통과 (0.63ms, 52.2MB)
테스트 9 통과 (0.51ms, 52.9MB)
테스트 10 통과 (0.55ms, 52.9MB)
테스트 11 통과 (0.84ms, 53.4MB)

 

 

이거는 그냥 그 board 자체에서 0이 아닌 값이 나올 때까지 for문을 돌리고, 만약에 0이 아닌 값이 나오면 스택에 넣고, 비교하는 걸로 코드를 짰었었음.

 

ArrayList에 넣고 꺼내고 그런 시간이 없다보니까 이번에 작성한 코드보다 시간 복잡도가 낮음.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 행렬의 덧셈

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
        var answer = Array(arr1.size, {IntArray(arr1[0].size)});
        
        for (x in 0..arr1.size-1) {
            for (y in 0..arr1[x].size-1) {
                answer[x][y] = arr1[x][y] + arr2[x][y];
            }
        }
        return answer;
    }
}

 

테스트 1 통과 (0.02ms, 63.7MB)
테스트 2 통과 (0.04ms, 62.9MB)
테스트 3 통과 (0.11ms, 65.1MB)
테스트 4 통과 (0.08ms, 63.1MB)
테스트 5 통과 (0.05ms, 63.4MB)
테스트 6 통과 (0.08ms, 63.4MB)
테스트 7 통과 (0.02ms, 63.7MB)
테스트 8 통과 (0.06ms, 63.5MB)
테스트 9 통과 (0.41ms, 66MB)
테스트 10 통과 (0.34ms, 63.9MB)
테스트 11 통과 (0.13ms, 66.2MB)
테스트 12 통과 (0.16ms, 65.5MB)
테스트 13 통과 (0.13ms, 66.1MB)
테스트 14 통과 (0.16ms, 65.2MB)
테스트 15 통과 (0.19ms, 67.5MB)
테스트 16 통과 (0.16ms, 64.4MB)
테스트 17 통과 (4.38ms, 94.3MB)

 

 

 

 

 

Array 진짜 복잡하네..

2차원 배열을 선언하는 것도 자바와 달라서 어려웠다..

 

 

 

 

1차원 배열 선언은 Array(길이, {내용}) 이런 식으로 선언하는데,

2차원 배열 역시 이 모양을 그대로 사용한다.

그래서 Array(길이, {Array(길이, {내용})})으로 모양을 만들고,

자바는 길이 구할 때 length를 쓰지만 코틀린에서는 size를 쓴다.

그 외에는 비슷하고...

 

 

 

 

행렬의 덧셈은 똑같은 위치의 값들을 다 더하는 것이기 때문에 for문으로 구하면 된다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

 

 

 

 

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        String[] keypad = {"l", "m", "r", "l", "m", "r", "l", "m", "r", "l", "m", "r"};
        
        int left = 9;
        int right = 11;
        
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 0) {
                numbers[i] = 10;
            } else {
                numbers[i]--;
            }
        }
                           
        for (int i = 0; i < numbers.length; i++) {
            int num = numbers[i];
            if (keypad[num].equals("l")) {
                left = num;
                answer.append("L");
            } else if (keypad[num].equals("r")) {
                right = num;
                answer.append("R");
            } else {
                int temp = func(num, left, right);
                if (temp == 1) {
                    left = num;
                    answer.append("L");
                } else if (temp == -1) {
                    right = num;
                    answer.append("R");
                } else {
                    if (hand.equals("left")) {
                        left = num;
                        answer.append("L");
                    } else {
                        right = num;
                        answer.append("R");
                    }
                }
            }
        }
        
        return answer.toString();
    }
    
    public int func(int number, int left, int right) {
        int num = number;
        
        int l1 = (left) / 3;
        int m1 = (num) / 3;
        int r1 = (right) / 3;
        
        int l2 = (left) % 3;
        int m2 = (num) % 3;
        int r2 = (right) % 3;
        
        double lFar = Math.abs(l1 - m1) + Math.abs(l2 - m2);
        double rFar = Math.abs(r1 - m1) + Math.abs(r2 - m2);
        
        if (lFar < rFar) {
            return 1;
        } else if (lFar > rFar) {
            return -1;
        } else {
            return 0;
        }
    }
}

 

테스트 1 통과 (0.04ms, 76.1MB)
테스트 2 통과 (0.04ms, 73.5MB)
테스트 3 통과 (0.04ms, 77.1MB)
테스트 4 통과 (0.03ms, 72.4MB)
테스트 5 통과 (0.05ms, 73MB)
테스트 6 통과 (0.06ms, 77.1MB)
테스트 7 통과 (0.06ms, 67.6MB)
테스트 8 통과 (0.08ms, 76.1MB)
테스트 9 통과 (0.07ms, 80.2MB)
테스트 10 통과 (0.05ms, 71.8MB)
테스트 11 통과 (0.05ms, 72.4MB)
테스트 12 통과 (0.08ms, 68.8MB)
테스트 13 통과 (0.09ms, 64.8MB)
테스트 14 통과 (0.16ms, 84.4MB)
테스트 15 통과 (0.32ms, 75.3MB)
테스트 16 통과 (0.27ms, 76.2MB)
테스트 17 통과 (0.58ms, 73.8MB)
테스트 18 통과 (0.28ms, 78.9MB)
테스트 19 통과 (0.50ms, 87.1MB)
테스트 20 통과 (0.50ms, 72.5MB)

 

 

 

 

 

도움을 받은 부분은 키패드의 거리 구할 때 유클리드 거리로 구했는데, 맨하탄 거리로 구해야 한다는 것을 알게 되었다..

 

 

 

 

 

좌표를 만들기 위해서 키패드 숫자에서 1씩 빼고, *은 9, 0은 10, #은 11로 만들어서 아래와 같은 표로 표현할 수 있다.

 

0
(실제 1)
1
(실제 2)
2
(실제 3)
3
(실제 4)
4
(실제 5)
5
(실제 6)
6
(실제 7)
7
(실제 8)
8
(실제 9)
9
(실제 *)
10
(실제 0)
11
(실제 #)

 

 

 

 

 

그래서 각각의 위치에 좌표를 구한다면 아래의 표와 같이 표현할 수 있는데,

x 좌표는 해당 위치의 숫자를 3으로 나눈 몫이고, y 좌표는 해당 위치의 숫자를 3으로 나눈 나머지이다.

 

0, 0 0, 1 0, 2
1, 0 1, 1 1, 2
2, 0 2, 1 2, 2
3, 0 3, 1 3, 2

 

 

 

 

 

그래서 좌표 (x1, y1), (x2, y2)의 맨하탄 거리를 구한다면 |x1 - x2| + |y1 - y2|이다.

처음엔 유클리드 거리로 해서 (x1-x2)^2 + (y1-y2)^2 로 했는데,

이렇게 하니까 테스트 13부터는 계속 오답이라고 떴다.

 

 

 

 

더보기

이전에 작성했던 코드

다른 풀이 참고해서 풀었던 기억이 있다

 

import java.util.*;

class Solution {
    public String solution(int[] numbers, String hand) {
        boolean value = true;
        int l = 10;
        int r = 12;
        
        if (hand.equals("right")){
            value = false;
        }
        
        ArrayList<String> data = new ArrayList<>();
        
        for (int i = 0; i < numbers.length; i++){
            int a = numbers[i];
            
            if (a == 0) a = 11;
            
            boolean value2 = true;
            
            if (a == 1 || a == 4 || a == 7){
                value2 = true;
            } else if (a == 3 || a == 6 || a == 9){
                value2 = false;
            } else {
                int ll = 0;
                int rr = 0;
                int l2 = l;
                int r2 = r;
                
                while (l2 != a){
                    if (l2 - a == -1 || l2 - a == 1){
                        ll++;
                        break;
                    }
                    
                    if (l2 > a){
                        l2 -= 3;
                        ll++;
                    } else {
                        l2 += 3;
                        ll++;
                    }
                }
                
                while (r2 != a){
                    if (r2 - a == -1 || r2 - a == 1){
                        rr++;
                        break;
                    }
                    
                    if (r2 > a){
                        r2 -= 3;
                        rr++;
                    } else {
                        r2 += 3;
                        rr++;
                    } 
                }
                
                if (ll > rr) {
                    value2 = false;
                } else if (ll < rr){
                    value2 = true;
                } else {
                    value2 = value;
                }
            }
            
            if (value2){
                data.add("L");
                l = a;
            } else {
                data.add("R");
                r = a;
            }
            
        }
        
        return String.join("", data);
    }
}

 

테스트 1 통과 (0.09ms, 52.1MB)
테스트 2 통과 (0.08ms, 51.8MB)
테스트 3 통과 (0.07ms, 52.4MB)
테스트 4 통과 (0.08ms, 53.2MB)
테스트 5 통과 (0.09ms, 51.8MB)
테스트 6 통과 (0.09ms, 53.1MB)
테스트 7 통과 (0.12ms, 52.8MB)
테스트 8 통과 (0.14ms, 53.9MB)
테스트 9 통과 (0.16ms, 53.6MB)
테스트 10 통과 (0.17ms, 52MB)
테스트 11 통과 (0.25ms, 52.1MB)
테스트 12 통과 (0.20ms, 53.1MB)
테스트 13 통과 (0.32ms, 52.2MB)
테스트 14 통과 (1.35ms, 51.7MB)
테스트 15 통과 (1.22ms, 52.6MB)
테스트 16 통과 (1.32ms, 53.4MB)
테스트 17 통과 (2.36ms, 52.5MB)
테스트 18 통과 (2.41ms, 52.4MB)
테스트 19 통과 (2.58ms, 52.6MB)
테스트 20 통과 (2.56ms, 52.1MB)

 

String으로 L, R을 더해서 시간은 조금 더 걸리는 듯하다.

 

 

 

 

 

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

 

 

코딩테스트 연습 - x만큼 간격이 있는 n개의 숫자

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

programmers.co.kr

 

 

 

 

 

class Solution {
    fun solution(x: Int, n: Int): LongArray {
        var answer = LongArray(n)

        for (num in 1..n) {
            answer[num-1] = num.toLong() * x;
        }
        return answer
    }
}

 

테스트 1 통과 (0.01ms, 62.6MB)
테스트 2 통과 (0.02ms, 63.8MB)
테스트 3 통과 (0.02ms, 62.8MB)
테스트 4 통과 (0.02ms, 63.7MB)
테스트 5 통과 (0.03ms, 63MB)
테스트 6 통과 (0.01ms, 63.1MB)
테스트 7 통과 (0.03ms, 65MB)
테스트 8 통과 (0.02ms, 63.7MB)
테스트 9 통과 (0.03ms, 61.3MB)
테스트 10 통과 (0.01ms, 63.2MB)
테스트 11 통과 (0.05ms, 62.7MB)
테스트 12 통과 (0.02ms, 63.2MB)
테스트 13 통과 (0.03ms, 64.1MB)
테스트 14 통과 (0.06ms, 63MB)

 

 

 

 

 

이거 하나 푸는데 array에 관한 것도 엄청 찾아봤네...

 

 

 

 

 

x씩 점점 커진 숫자 배열이 n 길이까지 있으니까 for문으로 이용하여 문제를 풀었는데

Array인 answer에 값을 넣는 것이 어려웠다.

 

 

 

 

 

longArrayOf()는 그냥 정말 말 그대로 텅 빈 long형의 Array를 뜻하는거라서 내가 계속 n으로 사이즈를 지정하려고 해도 틀렸다고 나왔고,

계속 검색해보다가 LongArray()로 만드는 것인 것을 깨닳고 코드를 짰다.

 

 

 

 

그리고 long으로 계산을 해서 넣어야하기 때문에 for문 속에서 num이나 x를 long으로 형 변환을 한 후에 계산을 했다.

(계산 후에 long으로 변환하면 틀렸나고 나오기 때문에 미리 변환 후에 하는 것이 낫다)

 

 

 

 

 

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

 

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

 

 

 

 

class Solution {
    public int solution(String s) {
        String[] word = {"zero", "one", "two", "three", "four", "five",
                        "six", "seven", "eight", "nine"};
        int answer = 0;
        String q = s;
        
        while (q.length() > 0) {
            String t = q.substring(0, 1);
            char temp = t.charAt(0);
            
            if (temp >= '0' && temp <= '9') {
                answer = answer * 10 + Integer.parseInt(t);
                q = q.substring(1, q.length());
                continue;
            }
            
            for (int j = 0; j < word.length; j++) {
                if (q.indexOf(word[j]) == 0) {
                    answer = answer * 10 + j;
                    q = q.substring(word[j].length(), q.length());
                    break;
                }
            }
            
        }
        return answer;
    }
}

 

테스트 1 통과 (0.03ms, 74.6MB)
테스트 2 통과 (0.04ms, 75.6MB)
테스트 3 통과 (0.05ms, 73.6MB)
테스트 4 통과 (0.07ms, 77.3MB)
테스트 5 통과 (0.05ms, 81.4MB)
테스트 6 통과 (0.08ms, 75.2MB)
테스트 7 통과 (0.05ms, 71.6MB)
테스트 8 통과 (0.05ms, 73MB)
테스트 9 통과 (0.11ms, 71.8MB)
테스트 10 통과 (0.04ms, 78.5MB)

 

 

 

 

음.. 일단 글자가 숫자인지를 먼저 파악하기 위해서 제일 앞 글자를 char로 바꿔서 숫자인지 파악한다.

answer에 숫자를 더하는 것은 한 번 할 때마다 자리수가 바뀌기 때문에 10을 곱한 후에 더해주는 식으로 진행하며

만약에 숫자가 아닐 경우에는 이제 String 배열에 만들어 놓은 숫자 영단어를 하나씩 비교해 가면서

해당하는 영단어가 제일 앞에서 시작되는지 안되는지를 파악하여 만들었다.

 

 

 

 

뭔가 설명이 이상하지만... 설명할 수 있는 방법이 없눼...

 

 

 

 

 

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

 

 

코딩테스트 연습 - 직사각형 별찍기

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. 제한 조건 n과 m은 각각 1000 이하인 자연수

programmers.co.kr

 

 

 

 

 

fun main(args: Array<String>) {
    val (a, b) = readLine()!!.split(' ').map(String::toInt)
    
    for (x in 1..b) {
        for (y in 1..a) {
            print("*");
        }
        println();
    }
}

 

테스트 1 통과 (161.86ms, 50.2MB)
테스트 2 통과 (149.95ms, 49.8MB)
테스트 3 통과 (203.91ms, 49.3MB)
테스트 4 통과 (219.12ms, 49.6MB)
테스트 5 통과 (193.55ms, 49.8MB)
테스트 6 통과 (183.95ms, 50.4MB)
테스트 7 통과 (178.82ms, 49.9MB)
테스트 8 통과 (212.59ms, 64.2MB)
테스트 9 통과 (252.06ms, 64.6MB)
테스트 10 통과 (169.45ms, 53.2MB)
테스트 11 통과 (231.77ms, 61.1MB)

 

 

 

 

 

코틀린 공부 시작..

 

 

 

 

 

for문 기본형 : for (요소 변수 in 컬렉션 또는 범위) { 반복할 본문 }

범위 지정은 숫자..숫자 이런 식으로 ..으로 하는 듯하고, 기본적으로 1씩 증가한다.

만약 2씩 증가하게 하고 싶다면 step 2를 뒤에 추가로 적으면 된다.

ex) for (i in 1..5 step 2) { }

 

 

 

 

그래서 a개씩 b줄로 출력하니까

바깥 for문의 범위는 b, 안쪽 for문의 범위는 a로 지정하여

안쪽 for문에서 print("*")로 별을 입력하고,

안쪽 for문이 끝나면 println()으로 줄 바꿈을 표시하여 출력하였다.

 

 

 

 

print()는 줄 바꿈 x

println()은 줄 바꿈 o

 

 

 

 

 

728x90
728x90

 

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

 

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        ArrayList<String> answer = new ArrayList<>();
        
        String[][] list = new String[record.length][2];
        HashMap<String, String> name = new HashMap<>();
        
        for (int i = 0; i < record.length; i++) {
            String[] re = record[i].split(" ");
            
            list[i][0] = re[0];
            list[i][1] = re[1];
            
            if (re[0].equals("Enter") || re[0].equals("Change")) {
                name.put(re[1], re[2]);
            } 
        }
        
        for (int i = 0; i < list.length; i++) {
            if (list[i][0].equals("Enter")) {
                answer.add(name.get(list[i][1]) + "님이 들어왔습니다.");
            } else if (list[i][0].equals("Leave")){
                answer.add(name.get(list[i][1]) + "님이 나갔습니다.");
            }
        }
        
        return answer.toArray(new String[answer.size()]);
    }
}

 

테스트 1 통과 (2.19ms, 73.3MB)
테스트 2 통과 (2.23ms, 75.2MB)
테스트 3 통과 (2.12ms, 76.2MB)
테스트 4 통과 (2.33ms, 76.4MB)
테스트 5 통과 (6.94ms, 75.8MB)
테스트 6 통과 (6.18ms, 88.1MB)
테스트 7 통과 (6.91ms, 77MB)
테스트 8 통과 (5.06ms, 81MB)
테스트 9 통과 (6.84ms, 82.6MB)
테스트 10 통과 (6.35ms, 79.8MB)
테스트 11 통과 (5.49ms, 90.7MB)
테스트 12 통과 (6.56ms, 78.2MB)
테스트 13 통과 (7.23ms, 78MB)
테스트 14 통과 (7.46ms, 86.1MB)
테스트 15 통과 (3.43ms, 86.7MB)
테스트 16 통과 (2.63ms, 79MB)
테스트 17 통과 (3.82ms, 82.9MB)
테스트 18 통과 (3.45ms, 81MB)
테스트 19 통과 (7.14ms, 85.4MB)
테스트 20 통과 (7.64ms, 85.2MB)
테스트 21 통과 (6.84ms, 78.4MB)
테스트 22 통과 (8.49ms, 74.9MB)
테스트 23 통과 (5.17ms, 79.8MB)
테스트 24 통과 (8.81ms, 87.9MB)
테스트 25 통과 (125.01ms, 169MB)
테스트 26 통과 (117.24ms, 160MB)
테스트 27 통과 (113.14ms, 162MB)
테스트 28 통과 (122.73ms, 178MB)
테스트 29 통과 (93.02ms, 175MB)
테스트 30 통과 (81.91ms, 168MB)
테스트 31 통과 (82.04ms, 162MB)
테스트 32 통과 (71.11ms, 164MB)

 

 

 

 

 

유저 ID는 그대로인데 이름은 변경할 수 있다.

그래서 for문으로 record를 순회할건데, 이 때 record[i]의 내용이 Enter이나 Change이면 이름을 변경될 수 있다.

그래서 유저ID에 맞게 이름을 넣기 위해서 해시맵을 사용하였고,

Enter이나 Change면 이름이 같든 다르든 그냥 변경하도록 했다.

 

 

 

 

 

그리고 나서 할 것이 들어왔다 나갔다 하는 문구를 적을 차례인데,

Enter면 들어왔다고, Leave면 나갔다고 문구를 적고 Change는 그냥 넘어가는 식으로 작성하였다.

 

 

 

 

더보기

처음 작성한 코드 : 

 

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        
        HashMap<String, String> name = new HashMap<>();
        ArrayList<String> data = new ArrayList<>();
        
        for (int i = 0; i < record.length; i++){
            String[] temp = record[i].split(" ");
            
            if (temp[0].equals("Leave")){
                data.add(record[i]);
                continue;
            }
            
            if (temp[0].equals("Enter")){
                data.add(record[i]);
                name.put(temp[1], temp[2]);
                continue;
            }
            
            if (temp[0].equals("Change")){
                name.put(temp[1], temp[2]);
            }
        }
        
        String[] answer = new String[data.size()];
        
        for (int i = 0; i < data.size(); i++){
            String[] temp = data.get(i).split(" ");
            
            String st = name.get(temp[1]);
            
            StringBuilder sb = new StringBuilder(st);
            
            if (temp[0].equals("Enter")){
                sb.append("님이 들어왔습니다.");
            } else if (temp[0].equals("Leave")){
                sb.append("님이 나갔습니다.");
            }
            
            answer[i] = sb.toString();
        }
        
        return answer;
    }
}

 

 

 

 

 

 

 

728x90

+ Recent posts