원래 문자를 다루는 문제를 정말 안좋아하는데
그래서 안풀다간 코테에서 문자 나오면 큰일날 것 같아서 풀었다.
https://www.acmicpc.net/problem/2607
이 문제는 두 단어가 있을 때 두 단어의 알파벳 구성이 같거나 하나 다른 경우를 찾아내는 문제이다.
핵심 포인트
char[] main = br.readLine().toCharArray();
일단 toCharArray를 통해서 char형태의 배열로 만들었다.
char[] now = br.readLine().toCharArray();
List<Character> list = new LinkedList<>();
for(int j = 0;j<now.length;j++){
list.add(now[j]);
}
그 다음 각 단어를 받아 똑같이 char 배열로 만들고
리스트에 각 알파벳을 담았다.
int cnt = 0;
for(int j = 0;j<main.length;j++){
if(list.contains((Character)main[j])){
list.remove((Character)main[j]);
}
else cnt++;
}
그 다음 main배열 속 알파벳과 현재 리스트 내부의 알파벳을 비교한다.
만약 같은 알파벳을 찾으면 해당 알파벳을 리스트에서 제거한다.
만약 같은 알파벳이 없으면 cnt를 하나 증가시킨다.
여기서 주의할 점은 remove 내부와 contains에 그냥 main[i] 만 넣으면 해당 char이 char형태로 인식되는게 아니라 아스키코드 숫자로 인식될수도 있다. 때문에 Character으로 형변환을 해주어야한다.
if(cnt <= 1 && list.size() <= 1){
ans++;
}
만약 cnt 값이 1보다 작거나 같고, 리스트에 남은 알파벳 수가 1보다 작거나 같으면 조건을 만족한다는 뜻이니까
ans를 하나 증가시킨다.
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
char[] main = br.readLine().toCharArray();
Arrays.sort(main);
int ans = 0;
for(int i = 0;i<n-1;i++){
char[] now = br.readLine().toCharArray();
List<Character> list = new LinkedList<>();
for(int j = 0;j<now.length;j++){
list.add(now[j]);
}
int cnt = 0;
for(int j = 0;j<main.length;j++){
if(list.contains((Character)main[j])){
list.remove((Character)main[j]);
}
else cnt++;
}
if(cnt <= 1 && list.size() <= 1){
ans++;
}
}
System.out.println(ans);
}
}
전체 코드는 위와 같다.
list 라이브러리 함수명을 잘 외우자!
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
백준 [자바 java] 12919 : A와 B 2 (1) | 2025.06.28 |
---|---|
백준 [자바 java] 14904 : 쉬운 최단거리 (0) | 2025.06.25 |
백준 [자바 java] 10655번 : 마라톤 (0) | 2025.06.24 |
백준[자바 java] 17086 : 아기상어 2 (0) | 2025.06.24 |
백준 [자바 java] 10986 : 나머지 합 (1) | 2025.03.05 |