λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개발/자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜

μ˜€ν”ˆμ±„νŒ…λ°© (Java)

by 1mj 2021. 10. 24.

https://programmers.co.kr/learn/courses/30/lessons/42888

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ˜€ν”ˆμ±„νŒ…λ°©

μ˜€ν”ˆμ±„νŒ…λ°© μΉ΄μΉ΄μ˜€ν†‘ μ˜€ν”ˆμ±„νŒ…λ°©μ—μ„œλŠ” μΉœκ΅¬κ°€ μ•„λ‹Œ μ‚¬λžŒλ“€κ³Ό λŒ€ν™”λ₯Ό ν•  수 μžˆλŠ”λ°, 본래 λ‹‰λ„€μž„μ΄ μ•„λ‹Œ κ°€μƒμ˜ λ‹‰λ„€μž„μ„ μ‚¬μš©ν•˜μ—¬ μ±„νŒ…λ°©μ— λ“€μ–΄κ°ˆ 수 μžˆλ‹€. μ‹ μž…μ‚¬μ›μΈ κΉ€ν¬λ£¨λŠ” μΉ΄μΉ΄μ˜€ν†‘ 였

programmers.co.kr

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ν”Œλž«νΌμ— μ˜¬λΌμ™€μžˆλŠ” 2019 KAKAO BLIND RECRUITMENT "μ˜€ν”ˆμ±„νŒ…λ°©" 문제 풀이이닀.

κ΄€λ¦¬μž λ©”μ‹œμ§€λŠ” λ“€μ–΄κ°ˆ λ•Œ, λ‚˜κ°ˆ λ•Œλ§Œ κΈ°λ‘ν•˜λ©΄ λ˜μ§€λ§Œ μ‚¬μš©μžκ°€ 이름을 λ³€κ²½ν•˜λ©΄ μ§€λ‚œ 이λ ₯도 λ°”λ€Œμ–΄μ•Ό ν•˜λ―€λ‘œ λ§ˆμ§€λ§‰μœΌλ‘œ 바뀐 이름을 μ•Œμ•„μ•Ό ν•œλ‹€.

 

 

첫 번째 방법 (μ‹œκ°„ 초과)

첫 번째둜 μƒκ°ν–ˆλ˜ 방법은 μ•„λž˜μ™€ κ°™λ‹€.

이λ ₯을 ν•œ 쀄씩 μ½μœΌλ©΄μ„œ λ“€μ–΄κ°ˆ λ•Œ λ˜λŠ” λ‚˜κ°ˆ λ•Œλ©΄ 맨 λμ—μ„œλΆ€ν„° 이λ ₯을 μ½μœΌλ©΄μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ 바뀐 이름을 μ‘°νšŒν•΄μ˜€λ„λ‘ μ½”λ“œλ₯Ό μ§°λ‹€.

λ’€μ—μ„œλΆ€ν„° μ½μœΌλ©΄μ„œ 바뀐 이름을 찾으면 반볡 νšŸμˆ˜κ°€ 적어 μ‹œκ°„μ΄ 더 적게 λ“€ 쀄 μ•Œμ•˜μ§€λ§Œ 데이터에 따라 였래 κ±Έλ¦¬λŠ” κ²½μš°κ°€ μžˆμ–΄μ„œ μ‹œκ°„ 초과둜 ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλ‹€.

 

import java.util.*;

class Solution {
    public String[] solution(String[] records) {
        List<String> result = new ArrayList<>();
        for (String record : records) {
            if (record.startsWith("Enter") || record.startsWith("Leave")) {
                String[] splitedRecord = record.split(" ");
                String name = getLastName(records, splitedRecord[1]);
                if (record.startsWith("Enter")) {
                    result.add(name + "λ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.");
                } else {
                    result.add(name + "λ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.");
                }
                
            }
        }
        return result.toArray(new String[result.size()]);
    }
    
    public String getLastName(String[] records, String userId) {
        for (int i = records.length - 1; i >= 0; i--) {
            String record = records[i];
            if (record.startsWith("Enter") || record.startsWith("Change")) {
                String[] splitedRecord = record.split(" ");
                if (splitedRecord[1].equals(userId)) {
                    return splitedRecord[2];
                }
            }
        }
        return "";
    }
}

 

 

두 번째 방법

λ§ˆμ§€λ§‰μœΌλ‘œ 바뀐 이름을 이λ ₯μ—μ„œ 맀번 μ‘°νšŒν•΄μ˜€λŠ” 것이 λΉ„νš¨μœ¨μ μΈ 것 κ°™μ•„ μœ μ € 아이디λ₯Ό ν‚€λ‘œν•˜λŠ” 맡에 μ €μž₯ν•˜λ„λ‘ λ³€κ²½ν–ˆλ‹€.

μœ μ € 아이디별 μ΅œμ’… λ³€κ²½λœ 이름을 μ €μž₯ν•˜λŠ” 반볡문과 이λ ₯을 κΈ°λ‘ν•˜λŠ” λ°˜λ³΅λ¬Έμ„ λ”°λ‘œ 돌렀 총 이λ ₯을 2번 ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— 쒋지 μ•Šμ€ 방법이긴 ν•˜μ§€λ§Œ ν†΅κ³Όν–ˆλ‹€.

 

import java.util.*;

class Solution {
    public String[] solution(String[] records) {
        List<String> answer = new ArrayList<>();    // κ²°κ³Ό λ¬Έμžμ—΄ 리슀트
        Map<String, String> map = new HashMap<>();  // μ΅œμ’… λ³€κ²½λœ id와 name의 쌍
        
        // μž…λ ₯된 λ³€κ²½ 기둝 쀑 Enter, Change μ‹œλ§ˆλ‹€ μœ μ €μ•„μ΄λ”” 별 이름을 μ €μž₯함
        for (String record : records) {
            if (!record.startsWith("Leave")) {
                String[] info = record.split(" ");
                map.put(info[1], info[2]);
            }
        }
        
        // μ‚¬μš©μžκ°€ λ“€μ–΄μ˜€κ±°λ‚˜ λ‚˜κ°„ 기둝을 λ©”μ‹œμ§€λ‘œ λ³€κ²½
        // μ‚¬μš©μž 이름은 μ΅œμ’… 정보λ₯Ό μ €μž₯ν•œ λ§΅μ—μ„œ κ°€μ Έμ˜΄
        for (String record : records) {
            if (!record.startsWith("Change")) {
                String[] info = record.split(" ");
                if (record.startsWith("Enter")) {
                    answer.add(map.get(info[1]) + "λ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.");
                } else if (record.startsWith("Leave")) {
                    answer.add(map.get(info[1]) + "λ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.");
                }
            }
        }
        
        return answer.toArray(new String[answer.size()]);
    }
}

 

 

μ„Έ 번째 방법

맡을 μ‚¬μš©ν•˜λ‹ˆκΉŒ ν™•μž₯μ„±, 가독성 μΈ‘λ©΄μ—μ„œ ν•œκ³„κ°€ μžˆμ–΄μ„œ Dtoλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½ν•΄λ³΄μ•˜λ‹€.

λ˜ν•œ, λ¬Έμžμ—΄ 포맷을 μ‚¬μš©ν•΄μ„œ 변경이 쉽도둝 ν•˜λ©° μœ λ™μ μΈ λ¬Έμžμ—΄ 뢀뢄을 λ§΅μ—μ„œ μ‘°νšŒν•΄μ˜€λŠ” μ΄λ¦„μœΌλ‘œ μΉ˜ν™˜ν•˜μ—¬ 두 번째 방법과 λ‘œμ§μ€ λΉ„μŠ·ν•˜λ‹€.

 

import java.util.*;

class Solution {
    private static final String ENTER_FORMAT = "%sλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.";
    private static final String LEAVE_FORMAT = "%sλ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.";
    
    private class User {
        public String userId;
        public String name;

        public User(String userId, String name) {
            this.userId = userId;
            this.name = name;
        }

    }

    private class Command {
        public String command;
        public String name;

        public Command(String command, String name) {
            this.command = command;
            this.name = name;
        }
    }

    public String[] solution(String[] records) {
        List<Command> commandList = new ArrayList<>();
        Map<String, User> userMap = new HashMap<>();

        for (String record : records) {
            String[] split = record.split(" ");
            String command = split[0];
            String userId = split[1];
            String name = null;

            switch(command) {
                case "Enter":   // λ“€μ–΄κ°ˆ λ•Œ μœ μ €μ•„μ΄λ””λ³„λ‘œ μ‚¬μš©μž 정보(μœ μ €μ•„μ΄λ””, 이름) μ—…λ°μ΄νŠΈ + 이λ ₯
                    name = split[2];
                    userMap.put(userId, new User(userId, name));
                    commandList.add(new Command(command, userId));
                    break;
                case "Leave":   // λ‚˜κ°ˆ λ•ŒλŠ” 이λ ₯만
                    commandList.add(new Command(command, userId));
                    break;
                case "Change":  // λ³€κ²½ν•  λ•ŒλŠ” κΈ°μ‘΄ 맡에 μ €μž₯된 정보 λ³€κ²½
                    name = split[2];
                    userMap.get(userId).name = name;
                    break;
            }
        }

        return commandList.stream()
                // μ €μž₯된 λ©”μ‹œμ§€μ˜ ν˜•μ‹μ„ 변경함(Enter -> ~λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.)
                // 좜λ ₯ν•  이름은 맡에 μ €μž₯된 κ°’μœΌλ‘œ 변경함
                .map(msg -> String.format(msg.command.equals("Enter") ? ENTER_FORMAT : LEAVE_FORMAT, userMap.get(msg.name).name))
                .toArray(ary -> new String[commandList.size()]);
    }
}

λŒ“κΈ€