Skip to content

Instantly share code, notes, and snippets.

@tae0y
Created January 2, 2022 15:02
2019 카카오 블라인드 문제풀이
import java.util.ArrayList;
import java.util.HashMap;
public class Solution {
public void _test() {
System.out.println(arrayCompare(solution(
new String[]{"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"}),
new String[]{"Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."}));
}
public String[] solution(String[] record) {
String[][] entities = new String[record.length][3];
HashMap<String, String> hm = new HashMap<>();
for(int i=0; i<record.length; i++){
entities[i] = record[i].split(" ");
if(entities[i][0].equals("Enter") || entities[i][0].equals("Change")) hm.put(entities[i][1], entities[i][2]);
}
ArrayList<String> list = new ArrayList<>();
for(int i=0; i<record.length; i++){
if(entities[i][0].equals("Change")) continue;
StringBuilder sb = new StringBuilder();
sb.append(hm.get(entities[i][1]));
sb.append("님이 ");
if(entities[i][0].equals("Enter")) sb.append("들어왔습니다.");
else sb.append("나갔습니다.");
list.add(sb.toString());
}
return list.toArray(new String[]{});
}
public boolean arrayCompare(String[] a, String[] b){
if(a.length != b.length) return false;
else for(int i=0; i<a.length; i++) if(!a[i].equals(b[i])) return false;
return true;
}
}
@tae0y
Copy link
Author

tae0y commented Jan 2, 2022

스트림으로 구현한 코드

package PRO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;

import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;

public class PRO42888 {
    public void _test() {
        System.out.println(arrayCompare(solution(
                new String[]{"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"}),
                new String[]{"Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."}));
    }

    public String[] solution(String[] record) {
        ArrayList<UserState> users = new ArrayList<>();
        for(String s : record) users.add(new UserState(s));
        HashMap<String, String> lastNickName = new HashMap<>();
        users.stream().forEachOrdered(u -> { if(u.state.equals("Enter") || u.state.equals("Change")) lastNickName.put(u.id, u.nickname); });
        ArrayList<String> answer = (ArrayList<String>) users.stream().map(u->{
            String msg = null;
            if(u.state.equals("Enter")) msg = lastNickName.get(u.id)+"님이 들어왔습니다.";
            else if(u.state.equals("Leave")) msg = lastNickName.get(u.id)+"님이 나갔습니다.";
            return msg;
        }).collect(toList());
        answer.removeIf(Objects::isNull);
        return answer.toArray(new String[]{});
    }

    private class UserState{
        String state;
        String id;
        String nickname;

        UserState(String s){
            String[] split = s.split(" ");
            this.state = split[0];
            this.id = split[1];
            if(split.length>2) this.nickname = split[2];
        }

        UserState(String state, String id, String nickname){
            this.state = state;
            this.id = id;
            this.nickname = nickname;
        }

    }

    public boolean arrayCompare(String[] a, String[] b){
        if(a.length != b.length) return false;
        else for(int i=0; i<a.length; i++) if(!a[i].equals(b[i])) return false;
        return true;
    }
}

@tae0y
Copy link
Author

tae0y commented Jan 2, 2022

단순반복 결과

테스트 1 〉	통과 (0.29ms, 52.8MB)
테스트 2 〉	통과 (0.25ms, 52.8MB)
테스트 3 〉	통과 (0.56ms, 52.9MB)
테스트 4 〉	통과 (0.58ms, 53MB)
테스트 5 〉	통과 (6.53ms, 53.7MB)
테스트 6 〉	통과 (10.51ms, 54.1MB)
테스트 7 〉	통과 (6.37ms, 54.4MB)
테스트 8 〉	통과 (6.40ms, 54.8MB)
테스트 9 〉	통과 (7.01ms, 53.3MB)
테스트 10 〉	통과 (7.24ms, 54.2MB)
테스트 11 〉	통과 (3.93ms, 54MB)
테스트 12 〉	통과 (3.92ms, 53.5MB)
테스트 13 〉	통과 (6.31ms, 53.5MB)
테스트 14 〉	통과 (7.03ms, 56.4MB)
테스트 15 〉	통과 (0.33ms, 51.9MB)
테스트 16 〉	통과 (0.27ms, 52.8MB)
테스트 17 〉	통과 (0.95ms, 53.5MB)
테스트 18 〉	통과 (0.85ms, 52.8MB)
테스트 19 〉	통과 (6.66ms, 53.6MB)
테스트 20 〉	통과 (5.71ms, 53.1MB)
테스트 21 〉	통과 (5.48ms, 54.9MB)
테스트 22 〉	통과 (5.72ms, 53.2MB)
테스트 23 〉	통과 (6.97ms, 55MB)
테스트 24 〉	통과 (7.71ms, 54.6MB)
테스트 25 〉	통과 (264.71ms, 159MB)
테스트 26 〉	통과 (276.27ms, 163MB)
테스트 27 〉	통과 (280.95ms, 165MB)
테스트 28 〉	통과 (306.53ms, 183MB)
테스트 29 〉	통과 (302.72ms, 184MB)
테스트 30 〉	통과 (257.79ms, 158MB)
테스트 31 〉	통과 (284.10ms, 161MB)
테스트 32 〉	통과 (196.49ms, 152MB)

스트림 결과

테스트 1 〉	통과 (5.73ms, 81.4MB)
테스트 2 〉	통과 (3.90ms, 78MB)
테스트 3 〉	통과 (4.14ms, 75.2MB)
테스트 4 〉	통과 (4.81ms, 74.5MB)
테스트 5 〉	통과 (10.18ms, 79MB)
테스트 6 〉	통과 (7.59ms, 82.2MB)
테스트 7 〉	통과 (7.47ms, 82.9MB)
테스트 8 〉	통과 (8.99ms, 81.5MB)
테스트 9 〉	통과 (9.47ms, 79.2MB)
테스트 10 〉	통과 (9.44ms, 86.4MB)
테스트 11 〉	통과 (8.02ms, 78.8MB)
테스트 12 〉	통과 (9.87ms, 77.5MB)
테스트 13 〉	통과 (7.67ms, 81.6MB)
테스트 14 〉	통과 (11.26ms, 77.2MB)
테스트 15 〉	통과 (5.87ms, 69.4MB)
테스트 16 〉	통과 (4.45ms, 78MB)
테스트 17 〉	통과 (5.17ms, 80.6MB)
테스트 18 〉	통과 (5.20ms, 74.9MB)
테스트 19 〉	통과 (11.62ms, 78.3MB)
테스트 20 〉	통과 (10.48ms, 81.7MB)
테스트 21 〉	통과 (7.90ms, 77.8MB)
테스트 22 〉	통과 (10.82ms, 87.4MB)
테스트 23 〉	통과 (11.06ms, 76.6MB)
테스트 24 〉	통과 (9.35ms, 81.3MB)
테스트 25 〉	통과 (117.59ms, 188MB)
테스트 26 〉	통과 (110.50ms, 196MB)
테스트 27 〉	통과 (117.65ms, 201MB)
테스트 28 〉	통과 (132.58ms, 211MB)
테스트 29 〉	통과 (114.45ms, 204MB)
테스트 30 〉	통과 (114.38ms, 184MB)
테스트 31 〉	통과 (89.32ms, 205MB)
테스트 32 〉	통과 (89.85ms, 166MB)

스트림/해시맵처리를 forEachOrdered로

테스트 1 〉	통과 (4.22ms, 76.1MB)
테스트 2 〉	통과 (4.39ms, 68.6MB)
테스트 3 〉	통과 (5.29ms, 68.9MB)
테스트 4 〉	통과 (4.41ms, 80.4MB)
테스트 5 〉	통과 (11.86ms, 77.2MB)
테스트 6 〉	통과 (8.05ms, 83.3MB)
테스트 7 〉	통과 (9.54ms, 82.3MB)
테스트 8 〉	통과 (12.16ms, 80.3MB)
테스트 9 〉	통과 (8.92ms, 86.2MB)
테스트 10 〉	통과 (13.57ms, 87.6MB)
테스트 11 〉	통과 (8.33ms, 73.2MB)
테스트 12 〉	통과 (10.27ms, 78.4MB)
테스트 13 〉	통과 (11.64ms, 83MB)
테스트 14 〉	통과 (8.12ms, 93.2MB)
테스트 15 〉	통과 (5.50ms, 80.3MB)
테스트 16 〉	통과 (5.76ms, 78.4MB)
테스트 17 〉	통과 (5.61ms, 72.5MB)
테스트 18 〉	통과 (5.29ms, 81.8MB)
테스트 19 〉	통과 (11.08ms, 87MB)
테스트 20 〉	통과 (16.76ms, 82.8MB)
테스트 21 〉	통과 (12.05ms, 78.5MB)
테스트 22 〉	통과 (9.65ms, 80.8MB)
테스트 23 〉	통과 (8.29ms, 77.5MB)
테스트 24 〉	통과 (11.01ms, 80.9MB)
테스트 25 〉	통과 (112.32ms, 192MB)
테스트 26 〉	통과 (117.31ms, 216MB)
테스트 27 〉	통과 (136.26ms, 222MB)
테스트 28 〉	통과 (157.63ms, 204MB)
테스트 29 〉	통과 (199.21ms, 224MB)
테스트 30 〉	통과 (139.98ms, 189MB)
테스트 31 〉	통과 (130.41ms, 171MB)
테스트 32 〉	통과 (88.50ms, 170MB)

순서있는작업은 단순반복, 매핑은 병렬스트림

테스트 1 〉	통과 (38.19ms, 87.2MB)
테스트 2 〉	통과 (17.86ms, 84.9MB)
테스트 3 〉	통과 (95.37ms, 93.6MB)
테스트 4 〉	통과 (42.66ms, 77.4MB)
테스트 5 〉	통과 (16.90ms, 87.4MB)
테스트 6 〉	통과 (25.75ms, 88.4MB)
테스트 7 〉	통과 (30.85ms, 77.8MB)
테스트 8 〉	통과 (54.58ms, 96.4MB)
테스트 9 〉	통과 (20.14ms, 88MB)
테스트 10 〉	통과 (25.56ms, 88.2MB)
테스트 11 〉	통과 (21.67ms, 87.7MB)
테스트 12 〉	통과 (12.88ms, 77.4MB)
테스트 13 〉	통과 (12.38ms, 82.4MB)
테스트 14 〉	통과 (11.79ms, 92.7MB)
테스트 15 〉	통과 (8.89ms, 83.4MB)
테스트 16 〉	통과 (10.48ms, 78.5MB)
테스트 17 〉	통과 (17.38ms, 82.9MB)
테스트 18 〉	통과 (8.87ms, 75.9MB)
테스트 19 〉	통과 (25.64ms, 92.8MB)
테스트 20 〉	통과 (17.79ms, 85.1MB)
테스트 21 〉	통과 (22.16ms, 76.4MB)
테스트 22 〉	통과 (26.15ms, 91.5MB)
테스트 23 〉	통과 (11.87ms, 82.5MB)
테스트 24 〉	통과 (21.75ms, 83.6MB)
테스트 25 〉	통과 (110.15ms, 201MB)
테스트 26 〉	통과 (106.77ms, 196MB)
테스트 27 〉	통과 (111.83ms, 197MB)
테스트 28 〉	통과 (112.34ms, 207MB)
테스트 29 〉	통과 (121.89ms, 219MB)
테스트 30 〉	통과 (101.84ms, 199MB)
테스트 31 〉	통과 (106.29ms, 206MB)
테스트 32 〉	통과 (91.63ms, 172MB)

순서있는작업은 단순반복, 매핑은 일반스트림


테스트 1 〉	통과 (3.72ms, 75.3MB)
테스트 2 〉	통과 (4.46ms, 77.6MB)
테스트 3 〉	통과 (3.74ms, 73.3MB)
테스트 4 〉	통과 (3.88ms, 77MB)
테스트 5 〉	통과 (10.50ms, 92.4MB)
테스트 6 〉	통과 (7.99ms, 90.5MB)
테스트 7 〉	통과 (8.00ms, 81.9MB)
테스트 8 〉	통과 (8.21ms, 74.9MB)
테스트 9 〉	통과 (11.84ms, 86.2MB)
테스트 10 〉	통과 (10.07ms, 73.4MB)
테스트 11 〉	통과 (7.48ms, 88.5MB)
테스트 12 〉	통과 (6.36ms, 83.2MB)
테스트 13 〉	통과 (9.93ms, 77MB)
테스트 14 〉	통과 (7.83ms, 70.1MB)
테스트 15 〉	통과 (4.40ms, 68.1MB)
테스트 16 〉	통과 (3.76ms, 78MB)
테스트 17 〉	통과 (3.95ms, 81.2MB)
테스트 18 〉	통과 (4.70ms, 77.8MB)
테스트 19 〉	통과 (8.00ms, 87.4MB)
테스트 20 〉	통과 (8.69ms, 87MB)
테스트 21 〉	통과 (8.98ms, 82.4MB)
테스트 22 〉	통과 (9.05ms, 76.1MB)
테스트 23 〉	통과 (9.50ms, 80.7MB)
테스트 24 〉	통과 (8.00ms, 73.1MB)
테스트 25 〉	통과 (122.47ms, 191MB)
테스트 26 〉	통과 (146.22ms, 184MB)
테스트 27 〉	통과 (138.20ms, 176MB)
테스트 28 〉	통과 (154.00ms, 213MB)
테스트 29 〉	통과 (134.54ms, 216MB)
테스트 30 〉	통과 (122.30ms, 190MB)
테스트 31 〉	통과 (87.71ms, 201MB)
테스트 32 〉	통과 (99.51ms, 182MB)

@tae0y
Copy link
Author

tae0y commented Jan 3, 2022

package PRO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;

import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;

public class PRO42888 {
    public void _test() {
        System.out.println(arrayCompare(solution(
                new String[]{"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"}),
                new String[]{"Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."}));
    }

    public String[] solution(String[] record) {
        ArrayList<UserState> users = new ArrayList<>();
        for(String s : record) users.add(new UserState(s));
        HashMap<String, String> lastNickName = new HashMap<>();
        //users.stream().forEachOrdered(u -> { if(u.state.equals("Enter") || u.state.equals("Change")) lastNickName.put(u.id, u.nickname); });
        for(UserState u : users){
            if(u.state.equals("Enter") || u.state.equals("Change")){
                lastNickName.put(u.id, u.nickname);
            }
        }

        ArrayList<String> answer = (ArrayList<String>) users.stream().parallel().map(u->{
            String msg = null;
            if(u.state.equals("Enter")) msg = lastNickName.get(u.id)+"님이 들어왔습니다.";
            else if(u.state.equals("Leave")) msg = lastNickName.get(u.id)+"님이 나갔습니다.";
            return msg;
        }).collect(toList());
        answer.removeIf(Objects::isNull);
        return answer.toArray(new String[]{});
    }

    private class UserState{
        String state;
        String id;
        String nickname;

        UserState(String s){
            String[] split = s.split(" ");
            this.state = split[0];
            this.id = split[1];
            if(split.length>2) this.nickname = split[2];
        }

        UserState(String state, String id, String nickname){
            this.state = state;
            this.id = id;
            this.nickname = nickname;
        }

    }

    public boolean arrayCompare(String[] a, String[] b){
        if(a.length != b.length) return false;
        else for(int i=0; i<a.length; i++) if(!a[i].equals(b[i])) return false;
        return true;
    }
}

@tae0y
Copy link
Author

tae0y commented Jan 3, 2022

순서있는 작업 순서 무관한 매핑 실행시간(최소/최대)
단순반복 단순반복 0.25ms / 302.72ms
스트림 스트림 3.90ms / 132.58ms
스트림(forEachOrdered) 스트림 4.22ms / 157.63ms
단순반복 스트림 3.72ms / 154.00ms
단순반복 병렬스트림 16.90ms / 121.89ms

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment