문제 출처 - Programmers
문제는 여기
[풀이]
1. 주어진 두 단어를 각각 잘라서 처리를 해야 하는데 이를 편하게 하기 위해 ArrayList를 사용해준다.
2. 대소문자는 구분하지 않기 위해 두 단어를 toUpperCase, toLowerCase 중 하나를 사용해 둘 다 같은 형태로 변경해준다.
3. 각 문자열을 두 단어씩으로 새로운 문자열을 만들어 알파벳으로만 구성되어있다면 list에 넣어준다.
4. 교집합과 합집합을 위한 ArrayList를 만들어준다.
5. A리스트에서 B리스트에 있는 것이 있다면 교집합에 넣어주고 B에서는 해당 값을 제거해준다.
6. A리스트에 있는 모든 값들은 합집합에 넣어준다.
7. 남아있는 B리스트의 값들을 합집합에 넣어준다.
8. 합집합의 크기가 0이라면 두 문자열 다 공백이므로 1을 주고 아니라면 교집합 / 합집합을 해준다.
9. 65536을 곱한 값을 출력해야하므로 곱해준다.
[접근]
1. 두 문자열을 두자리씩 잘라서 넣을 리스트가 필요하고, 교집합과 합집합을 나타낼 리스트가 필요하다고 생각하였고 리스트를 통해 문제를 해결하였다.
[코드]
import java.io.*;
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
// 1번 문자열 쪼개서 담을 리스트
ArrayList<String> A = new ArrayList<>();
// 2번 문자열 쪼개서 담을 리스트
ArrayList<String> B = new ArrayList<>();
// 합집합
ArrayList<String> plus = new ArrayList<>();
// 교집합
ArrayList<String> same = new ArrayList<>();
// 대소문자 무시 == 둘 다 같은 형태로 바꿔주기
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
for (int i = 0 ; i < str1.length() - 1 ; i++) {
char c = str1.charAt(i);
char ch = str1.charAt(i + 1);
// 대문자가 아니면 영단어가 아니므로 체크
if (c >= 'A' && c <= 'Z' && ch >= 'A' && ch <= 'Z') {
String s = c + " " + ch;
// 두 글자씩 잘라서 넣기
A.add(s);
}
}
for (int i = 0 ; i < str2.length() - 1 ; i++) {
char c = str2.charAt(i);
char ch = str2.charAt(i + 1);
// 대문자가 아니면 영단어가 아니므로 체크
if (c >= 'A' && c <= 'Z' && ch >= 'A' && ch <= 'Z') {
String s = c + " " + ch;
// 두 글자씩 잘라서 넣기
B.add(s);
}
}
// 모든 A에 있는 모든 단어 체크
for (String s : A) {
// 합집합
plus.add(s);
// 해당 단어가 있어서 B에서 제거되면 true 리턴
// 아니면 false 리턴
if (B.remove(s)) {
// 있는거니까 중복된다는 소리
// 그럼 교집합
same.add(s);
}
}
for (String s : B) {
// B에서 교집합 빼고나서 남은 것들 합집합에 넣어주기
plus.add(s);
}
// 소수가 담기니까 double형
double answer = 0;
// 합집합의 크기가 0이다 == 둘 다 공집합이다
if (plus.size() == 0) {
answer = 1;
} else {
answer = (double)same.size() / (double)plus.size();
}
return (int)(answer * 65536);
}
}
'문제 풀이 > Programmers' 카테고리의 다른 글
[프로그래머스] 기능개발 (JAVA) (0) | 2022.03.22 |
---|---|
[프로그래머스] 로또의 최고 순위와 최저 순위 (JAVA) (0) | 2022.03.21 |
[프로그래머스] 없는 숫자 더하기 (JAVA) (0) | 2022.03.17 |
[프로그래머스] 3진법 뒤집기 (JAVA) (0) | 2022.03.16 |
[프로그래머스] 이진 변환 반복하기 (JAVA) (0) | 2022.03.15 |