https://www.acmicpc.net/problem/3059
등장하지 않는 문자의 합
1 초 | 128 MB | 5255 | 3123 | 2842 | 60.494% |
문제
알파벳 대문자로 구성되어있는 문자열 S가 주어졌을 때, S에 등장하지 않는 알파벳 대문자의 아스키 코드 값의 합을 구하는 프로그램을 작성하시오.
문자열 S가 “ABCDEFGHIJKLMNOPQRSTUVW” 일 때, S에 등장하지 않는 알파벳 대문자는 X, Y, Z이다. X의 아스키 코드 값은 88, Y는 89, Z는 90이므로 이 아스키 코드 값의 합은 267이다.
알파벳 대문자의 아스키 코드 값은 다음과 같다.
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 |
입력
입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성되어 있고, 문자열 S가 주어진다. S는 알파벳 대문자로만 구성되어 있고, 최대 1000글자이다.
출력
각 테스트 데이터에 대해, 입력으로 주어진 문자열 S에 등장하지 않는 알파벳 대문자의 아스키 코드 값의 합을 한 줄에 하나씩 출력한다.
예제 입력 1 복사
2
ABCDEFGHIJKLMNOPQRSTUVW
A
예제 출력 1 복사
267
1950
풀이 : 처음에는 단순히 A-Z까지의 아스키 코드의 합에서 입력된 문자들의 아스키 코드 합을 빼주는 것으로 답을 작성했다.
물론 예제를 대입해보면 맞게 나왔으나 내가 놓친 부분이 있었다.
만약 알파벳이 반복해서 나오면?
내가 작성한 부분은 모든 알파벳을 더하는 것이므로 만약 S='AAA' 이면 A의 아스키 코드 값이 3번이나 들어가는 것이다.
A의 아스키 코드 값은 한 번만 들어가야 하는데 말이다.
따라서 코드를 다음과 같이 수정했다.
(( 처음 작성한 코드))
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));
int T = Integer.parseInt(br.readLine());
int sum = 0;
//A~Z까지의 아스키 코드값의 합
for(int i=0; i<26; i++){
int startAskii = 65;
sum+=startAskii+i;
}
// A~Z 아스키 코드 합 - 입력된 알파벳 합
for(int i=0; i<T; i++)
{
int inputSum= 0;
String S = br.readLine();
char [] ch = S.toCharArray();
for(int j=0; j<S.length(); j++){
int c = ch[j];
inputSum += c;
}
System.out.println(sum-inputSum);
}
}
}
(( 수정한 코드 - 중복되는 문자 가능성 배제))
중복 문자를 어떻게 처리할까 하다가 중복을 허용하지 않는 Set에 담아 합계를 구하기로 했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
public class Main {
// 백준 3059. 등장하지 않는 문자의 합
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int sum = 0;
//A~Z까지의 아스키 코드값의 합
for(int i=0; i<26; i++){
sum+='A'+i;
}
//입력된 문자들의 아스키 코드값 합
for(int i=0; i<T; i++)
{
int inputSum= 0;
String S = br.readLine();
char [] ch = S.toCharArray();
HashSet<Integer> set = new HashSet<>();
for(int j=0; j<S.length(); j++){
// 중복값을 허용하지 않는 Set
set.add((int)ch[j]);
}
// 중복을 배제한 set의 합계를 구함
for(int val : set){
inputSum += val;
}
// A~Z 아스키 코드 합 - 입력된 알파벳 합
System.out.println(sum-inputSum);
}
}
}
>> I used a HashSet to eliminate duplicate characters and calculated the sum of the ASCII values of the missing characters.
'알고리즘 문제풀이 > Beakjoon' 카테고리의 다른 글
백준 2783. 삼각 김밥 (JAVA) (1) | 2023.02.22 |
---|---|
백준 4388. 받아올림 (JAVA) (1) | 2023.02.17 |
백준 2985. 세 수 (JAVA) (0) | 2023.02.13 |
백준 5753. Pascal Library (feat. Chat GPT) (0) | 2023.02.11 |
백준 2588. 곱셈 (JAVA) (0) | 2023.02.10 |