개발자는 기록이 답이다

[백준/BOJ][Java][5622] 다이얼 본문

알고리즘/백준

[백준/BOJ][Java][5622] 다이얼

slow-walker 2023. 8. 25. 14:07

 

 

 

https://www.acmicpc.net/problem/5622

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net

 

내가 푼 풀이

- switch-case 문으로 코드를 작성하면 쉽게 풀 수 있다.

- 맨 처음에는 0이랑 1에 대한건 어떻게 받지? 생각했는데, 어차피 입력값에 있는 숫자만 찾으면 되니까 신경 쓸 필요 없다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] charArray = br.readLine().toCharArray();
        int ans = 0;
        for (char character : charArray) {
            switch (character) {
                case 'A':
                case 'B':
                case 'C':
                    ans += 3;
                    break;
                case 'D':
                case 'E':
                case 'F':
                    ans += 4;
                    break;
                case 'G' :
                case 'H' :
                case 'I':
                    ans += 5;
                    break;
                case 'J' :
                case 'K' :
                case 'L' :
                    ans += 6;
                    break;
                case 'M' :
                case 'N' :
                case 'O' :
                    ans += 7;
                    break;
                case 'P' :
                case 'Q' :
                case 'R' :
                case 'S' :
                    ans += 8;
                    break;
                case 'T' :
                case 'U' :
                case 'V' :
                    ans += 9;
                    break;
                case 'W' :
                case 'X' :
                case 'Y' :
                case 'Z' :
                    ans += 10;
                    break;
            }
        }
        System.out.println(ans);


    }
}
메모리 시간 언어 코드 길이
11432KB 80ms Java8 1633B

 

다른 사람 풀이 1

- 숫자여서 아스키코드 값인가 생각했는데, 그게 아니고 알파벳의 인덱스 위치로 시간을 저장했다.

- 해당 페이지에서 제일 성능이 좋은 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String S = br.readLine();  // 입력 문자열을 받아옵니다.
        char[] word = S.toCharArray();  // 입력 문자열을 문자 배열로 변환합니다.

        // 알파벳에 해당하는 다이얼 숫자의 시간 초를 저장하는 배열을 생성합니다.
        int[] alpha = new int[26];
        
        // 알파벳에 해당하는 다이얼 숫자의 시간 초를 배열에 저장합니다.
        for (int i = 0; i < alpha.length; i++) {
            if ((i >= 15 && i <= 18)) { // P가 15번째 인덱스 위치
                alpha[i] = 8; // P, Q, R, S까지 8초 저장
            } else if (i >= 19 && i <= 21) {
                alpha[i] = 9;
            } else if (i >= 22) {
                alpha[i] = 10;
            } else {
           		// 미만 인덱스는 산수로 계산
                alpha[i] = (i / 3) + 3; // (14 / 3) + 3 = 7
            }
        }

        int time = 0;  // 다이얼 숫자 시간의 총 합을 나타내는 변수를 초기화.
        
        // 입력 문자열의 각 문자에 대해 다이얼 숫자를 더합니다.
        for (int i = 0; i < word.length; i++) {
            time += alpha[word[i] - 65];  // 'A'가 65에 대응되므로, 해당 알파벳에 대한 다이얼 숫자를 가져옵니다.
        }

        System.out.println(time);
    }
}
메모리 시간 언어 코드 길이
12756KB 68ms Java8 925B

 

 

다른 사람 풀이 2

- 내가 푼 풀이랑 성능은 비슷한데, 분기처리를 해서 코드 길이가 짧아서 더 효율적인 것같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] charArray = br.readLine().toCharArray();
        int ans = 0;
        for (char character : charArray) {
            if ( character >= 'A' && character <= 'C') {
                ans += 3;
            } else if ( character >= 'D' && character <= 'F') {
                ans += 4;
            } else if ( character >= 'G' && character <= 'I') {
                ans += 5;
            } else if ( character >= 'J' && character <= 'L') {
                    ans += 6;
            } else if ( character >= 'M' && character <= 'O') {
                ans += 7;
            } else if ( character >= 'P' && character <= 'S') {
                ans += 8;
            } else if ( character >= 'T' && character <= 'V') {
                ans += 9;
            } else if ( character >= 'W' && character <= 'Z') {
                ans += 10;
            }
        }
        System.out.println(ans);


    }
}
메모리 시간 언어 코드 길이
11368KB 80ms Java8 1166B

 

다른 사람 풀이 3

- Map을 사용한 방식인데, 손가락이 아플 것 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] charArray = br.readLine().toCharArray();
        
        Map<Character, Integer> dialMap = new HashMap<>();
        dialMap.put('A', 3);
        dialMap.put('B', 3);
        dialMap.put('C', 3);
        dialMap.put('D', 4);
        dialMap.put('E', 4);
        dialMap.put('F', 4);
        dialMap.put('G', 5);
        dialMap.put('H', 5);
        dialMap.put('I', 5);
        dialMap.put('J', 6);
        dialMap.put('K', 6);
        dialMap.put('L', 6);
        dialMap.put('M', 7);
        dialMap.put('N', 7);
        dialMap.put('O', 7);
        dialMap.put('P', 8);
        dialMap.put('Q', 8);
        dialMap.put('R', 8);
        dialMap.put('S', 8);
        dialMap.put('T', 9);
        dialMap.put('U', 9);
        dialMap.put('V', 9);
        dialMap.put('W', 10);
        dialMap.put('X', 10);
        dialMap.put('Y', 10);
        dialMap.put('Z', 10);
        
        int ans = 0;
        for (char character : charArray) {
            ans += dialMap.get(character);
        }
        
        System.out.println(ans);
    }
}
메모리 시간 언어 코드 길이
11456KB
76ms Java8 1366B

 

다른 사람 풀이 4

- Map을 사용한 다른 방식을 봤는데, 코드 길이는 제일 긴데, 성능이 괜찮은 것 같다.

- putIfAbsent라는 키워드를 처음 알게 되었다. 이런 방식을 다른 문제에서 사용할 수 있을 것 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] charArray = br.readLine().toCharArray();
        // 알파벳과 그에 해당하는 다이얼 숫자(시간 초)의 맵을 만든다.
        Map<Character, Integer> dialMap = new HashMap<>();
        dialMap.put('A', 3);
        dialMap.put('B', 3);
        dialMap.put('C', 3);
        dialMap.put('D', 4);
        dialMap.put('E', 4);
        dialMap.put('F', 4);
        dialMap.put('G', 5);
        dialMap.put('H', 5);
        dialMap.put('I', 5);
        dialMap.put('J', 6);
        dialMap.put('K', 6);
        dialMap.put('L', 6);
        dialMap.put('M', 7);
        dialMap.put('N', 7);
        dialMap.put('O', 7);
        dialMap.put('P', 8);
        dialMap.put('Q', 8);
        dialMap.put('R', 8);
        dialMap.put('S', 8);
        dialMap.put('T', 9);
        dialMap.put('U', 9);
        dialMap.put('V', 9);
        dialMap.put('W', 10);
        dialMap.put('X', 10);
        dialMap.put('Y', 10);
        dialMap.put('Z', 10);
        
        // 다이얼 숫자와 그에 해당하는 문자의 리스트를 관리하는 맵을 만든다.
        Map<Integer, List<Character>> dialNumbersToStrings = new HashMap<>();
        
        // dialMap의 정보를 바탕으로 dialNumbersToStrings 맵을 채운다.
        for (Map.Entry<Character, Integer> entry : dialMap.entrySet()) {
            char character = entry.getKey();
            int dialNumber = entry.getValue();
            
            // 만약 dialNumber에 해당하는 리스트가 없으면, 새로 생성합니다.
            dialNumbersToStrings.putIfAbsent(dialNumber, new ArrayList<>());
            
            // dialNumber에 해당하는 리스트에 현재 알파벳 character를 추가합니다.
            dialNumbersToStrings.get(dialNumber).add(character);
        }
        // 문자열에서 각 문자에 해당하는 다이얼 숫자를 찾아 합산합니다.
        int ans = 0;
        for (char character : charArray) {
        	// 문자에 해당하는 다이얼 숫자를 가져옵니다.
            int dialNumber = dialMap.get(character);
            // 다이얼 숫자에 해당하는 초를 정답에 더합니다.
            ans += dialNumber;
        }
        
        System.out.println(ans);
    }
}
메모리 시간 언어 코드 길이
11572KB
76ms Java8 1884B

 

다른 사람 풀이 5

- Map방식이 재밌는거 같아서 한가지 더 가져왔다.

- 성능은 제일 안좋다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] charArray = br.readLine().toCharArray();
        
        Map<Integer, List<Character>> dialNumbersToStrings = new HashMap<>();
        dialNumbersToStrings.put(3, new ArrayList<>());
        dialNumbersToStrings.put(4, new ArrayList<>());
        dialNumbersToStrings.put(5, new ArrayList<>());
        dialNumbersToStrings.put(6, new ArrayList<>());
        dialNumbersToStrings.put(7, new ArrayList<>());
        dialNumbersToStrings.put(8, new ArrayList<>());
        dialNumbersToStrings.put(9, new ArrayList<>());
        dialNumbersToStrings.put(10, new ArrayList<>());
        
        dialNumbersToStrings.get(3).add('A');
        dialNumbersToStrings.get(3).add('B');
        dialNumbersToStrings.get(3).add('C');
        dialNumbersToStrings.get(4).add('D');
        dialNumbersToStrings.get(4).add('E');
        dialNumbersToStrings.get(4).add('F');
        dialNumbersToStrings.get(5).add('G');
        dialNumbersToStrings.get(5).add('H');
        dialNumbersToStrings.get(5).add('I');
        dialNumbersToStrings.get(6).add('J');
        dialNumbersToStrings.get(6).add('K');
        dialNumbersToStrings.get(6).add('L');
        dialNumbersToStrings.get(7).add('M');
        dialNumbersToStrings.get(7).add('N');
        dialNumbersToStrings.get(7).add('O');
        dialNumbersToStrings.get(8).add('P');
        dialNumbersToStrings.get(8).add('Q');
        dialNumbersToStrings.get(8).add('R');
        dialNumbersToStrings.get(8).add('S');
        dialNumbersToStrings.get(9).add('T');
        dialNumbersToStrings.get(9).add('U');
        dialNumbersToStrings.get(9).add('V');
        dialNumbersToStrings.get(10).add('W');
        dialNumbersToStrings.get(10).add('X');
        dialNumbersToStrings.get(10).add('Y');
        dialNumbersToStrings.get(10).add('Z');
        
        int ans = 0;
        for (char character : charArray) {
            for (Map.Entry<Integer, List<Character>> entry : dialNumbersToStrings.entrySet()) {
                int dialNumber = entry.getKey();
                List<Character> characters = entry.getValue();
                if (characters.contains(character)) {
                    ans += dialNumber;
                    break;
                }
            }
        }
        
        System.out.println(ans);
    }
}
메모리 시간 언어 코드 길이
11608MB
80ms Java8 2653B

 

참고 링크 :

https://junghn.tistory.com/entry/JAVA-Map-putIfAbsent-이란-사용방법-및-예제

 

[JAVA] Map - putIfAbsent 이란? 사용방법 및 예제

putIfAbsent - Key 값이 존재하는 경우 Map의 Value의 값을 반환하고, Key값이 존재하지 않는 경우 Key와 Value를 Map에 저장하고 Null을 반환합니다. 사용방법 default V putIfAbsent(K key, V value) 매개변수 key - 지정

junghn.tistory.com