Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
[백준/BOJ][Java][5622] 다이얼 본문
https://www.acmicpc.net/problem/5622
내가 푼 풀이
- 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-이란-사용방법-및-예제
'알고리즘 > 백준' 카테고리의 다른 글
[백준/BOJ][Java][11718] 그대로 출력하기 (0) | 2023.08.25 |
---|---|
[백준/BOJ][Java][1152] 단어의 개수 (0) | 2023.08.24 |
[백준/BOJ][Java][2675] 문자열 반복 (0) | 2023.08.24 |
[백준/BOJ][Java][2908] 상수 (0) | 2023.08.24 |
[백준/BOJ][Java][10809] 알파벳 찾기 (1) | 2023.08.24 |