오늘은 문자열을 단계별 문제로 풀었다.
문자열 총 11문제를 풀었다.
이전에 풀었던 숫자에 관련된 코드들 보다 새롭게 적용해야 할 것들이 있었다.
이번에 풀었던 문제중에서 알아둬야할 문제 몇 개를 적어본다.
백준 10809 - 알파벳 찾기
https://www.acmicpc.net/problem/10809
문제분석
문제를 요약하자면, 단어를 받아서, a부터 z의 알파벳중에서 단어에 존재한다면, 해당 단어의 위치인덱스를 출력하는 문제이다.
여기서 추가적으로 해당하는 알파벳이 단어에 존재하지 않으면 -1로 표시한다.
여기서 case로 a - z까지를 작성해도 되지만,
26개나 되는 케이스를 적는 것은 불필요하다고 느꼈다.
그래서 ASCII코드를 응용해볼 것이다.
빈 26크기를 가진 배열(알파벳 크기)을 만든다. 일단은 모두 비어있음을 표시하기 위해 -1로 초기화 해준다.
단어의 알파벳을 처음부터 순회하면서 아스키 코드에서 가장 작은 값인 'a'를 기준으로 해당 알파벳을 찾으면,
해당 인덱스를 부여하도록 한다.
정답
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String inputString = sc.nextLine().toLowerCase(); // 대소문자 구분을 없애기 위해 소문자로 변환
char[] charArray = inputString.toCharArray();
int[] alphabetIndexes = new int[26]; // 알파벳 개수(26개)의 배열 생성, 기본값 -1
// 배열 초기화: -1로 채우기
for (int i = 0; i < 26; i++) {
alphabetIndexes[i] = -1;
}
for (int i = 0; i < charArray.length; i++) {
char alphabet = charArray[i];
int index = alphabet - 'a'; // 알파벳의 배열 인덱스 계산
// 해당 알파벳의 인덱스를 찾은 경우
if (alphabetIndexes[index] == -1) {
alphabetIndexes[index] = i;
}
}
// 결과 출력
for (int i = 0; i < alphabetIndexes.length; i++) {
System.out.print(alphabetIndexes[i] + " ");
}
sc.close();
}
}
문제 분석에 의해서 충실하게 적는다.
백준 5622 - 다이얼
https://www.acmicpc.net/problem/5622
문제분석
옛날식 다이얼 문제이다.
옛날식 다이얼처럼 번호쪽으로 이동, 다시 처음으로 가서 다시 번호를 이동 해서 원하는 알파벳을 출력하기 위해서 최소시간을 구하는 프로그램을 작성하는 문제이다.
처음 볼 때는 문제를 어떻게 짜야할지 고민이었다.
for문이나 while문으로 반복을 하기에는 숫자 하나당 할당되어 있는 알파벳이 3개였고, 다시 초기화가 되므로 애매하다는 생각이 들었다.
그래서 case문으로 번호에 필요한 시간을 할당해서 알파벳마다 부여하는 식으로 짜야겠다고 생각했다.
정답
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
int count = 0;
int k = str.length();
for(int i = 0; i < k; i++) {
switch(str.charAt(i)) {
case 'A' : case 'B': case 'C' :
count += 3;
break;
case 'D' : case 'E': case 'F' :
count += 4;
break;
case 'G' : case 'H': case 'I' :
count += 5;
break;
case 'J' : case 'K': case 'L' :
count += 6;
break;
case 'M' : case 'N': case 'O' :
count += 7;
break;
case 'P' : case 'Q': case 'R' : case 'S' :
count += 8;
break;
case 'T' : case 'U': case 'V' :
count += 9;
break;
case 'W' : case 'X': case 'Y' : case 'Z' :
count += 10;
break;
}
}
System.out.print(count);
}
}
백준 2908 - 상수
https://www.acmicpc.net/problem/2908
문제분석
문제를 요약하자면,
뒤집은 두 수를 비교해서 큰 수를 출력하는 문제이다.
숫자들 둘 다 뒤집어야 하므로, 숫자를 뒤집는 함수를 만들어야한다.
그리고 Math.max로 뒤집은 두 숫자를 비교하면 될 것이다.
정답
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 두 개의 숫자 입력받기
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int reversedNum1 = reverseNumber(num1); // 첫 번째 숫자 뒤집기
int reversedNum2 = reverseNumber(num2); // 두 번째 숫자 뒤집기
int result = Math.max(reversedNum1, reversedNum2); // 두 뒤집은 숫자 중 큰 수 선택
System.out.println(result);
sc.close();
}
// 숫자를 뒤집는 함수
public static int reverseNumber(int num) {
int reversed = 0;
while (num != 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return reversed;
}
}
'Code Test > Java' 카테고리의 다른 글
백준 단계별 풀이 - 일반 수학1 (1) | 2023.12.31 |
---|---|
백준 단계별 풀이 - 심화1 (1) | 2023.12.27 |
백준 단계별 풀이 - 반복문, 1차원 배열 (1) | 2023.12.21 |
백준 단계별 풀이 - 입출력과 사칙연산, 조건문 (0) | 2023.12.19 |
백준 2018 - 수들의 합 5 (1) | 2023.12.19 |