알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://school.programmers.co.kr/learn/courses/30/lessons/17677?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Think🤔
import java.util.ArrayList;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
double jaka = 0;
ArrayList<String> arr1 = new ArrayList();
ArrayList<String> arr2 = new ArrayList();
for(int i=0; i<str1.length() - 1; i++){
char c1 = str1.charAt(i);
char c2 = str1.charAt(i+1);
if(Character.isLetter(c1) && Character.isLetter(c2)){
arr1.add(""+c1+c2);
}
}
for(int i=0; i<str2.length() - 1; i++){
char c1 = str2.charAt(i);
char c2 = str2.charAt(i+1);
if(Character.isLetter(c1) && Character.isLetter(c2)){
arr2.add(""+c1+c2);
}
}
ArrayList<String> intersection = new ArrayList<>(arr1);
intersection.retainAll(arr2); // arr1과 arr2의 교집합을 intersection에 저장
int kyo = intersection.size();
int hab = arr1.size() + arr2.size() - kyo;
if(intersection.size() == 0){
answer = 65536;
} else {
answer = (int)((double) kyo / hab * 65536);
}
System.out.println(arr1);
System.out.println(arr2);
System.out.println("kyo : " + kyo);
System.out.println("hab : " + hab);
return answer;
}
}
// ab+면 요소를 하나로 삼음
// ab+ -> ab
// abc -> ab bc
// 유사도 체크 후 정수 버리고 곱함 0.42 * 65536
// 반복문으로 자르고 특수문자면 앞에만 하고 넘김 , 한 만큼 cnt 세고 뺴면 교집합
// [ FR ] , RA , AN , [ NC ] , CE
// [ FR ] , RE , EN , [ NC ] , CH
// 2 / 8
// 교집합 = 같은지 확인
// 합집합 = 전체 - 교집합
이렇게 했을 경우 4,5,7,9,10,11,13 실패
반례를 차장보기로 한다.
합집합 구하는 방식의 문제
import java.util.ArrayList;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
double jaka = 0;
ArrayList<String> arr1 = new ArrayList();
ArrayList<String> arr2 = new ArrayList();
for(int i=0; i<str1.length() - 1; i++){
char c1 = str1.charAt(i);
char c2 = str1.charAt(i+1);
if(Character.isLetter(c1) && Character.isLetter(c2)){
arr1.add(""+c1+c2);
}
}
for(int i=0; i<str2.length() - 1; i++){
char c1 = str2.charAt(i);
char c2 = str2.charAt(i+1);
if(Character.isLetter(c1) && Character.isLetter(c2)){
arr2.add(""+c1+c2);
}
}
ArrayList<String> union = new ArrayList<>(); // 합집합
ArrayList<String> intersection = new ArrayList<>(); // 교집합
for(String s : arr1){
if(arr2.remove(s)){
intersection.add(s);
}
union.add(s); // 교집합 빼고 넣기
}
for(String s : arr2){ // 나머지 arr2값 넣기
union.add(s);
}
int kyo = intersection.size();
int hab = union.size();
if(intersection.size() == 0){
answer = 65536;
} else {
answer = (int)((double) kyo / (double)hab * 65536);
}
System.out.println(arr1);
System.out.println(arr2);
System.out.println("kyo : " + kyo);
System.out.println("hab : " + hab);
return answer;
}
}
Solution✍
import java.util.ArrayList;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
double jaka = 0;
ArrayList<String> arr1 = new ArrayList();
ArrayList<String> arr2 = new ArrayList();
for(int i=0; i<str1.length() - 1; i++){
char c1 = str1.charAt(i);
char c2 = str1.charAt(i+1);
if(Character.isLetter(c1) && Character.isLetter(c2)){
arr1.add(""+c1+c2);
}
}
for(int i=0; i<str2.length() - 1; i++){
char c1 = str2.charAt(i);
char c2 = str2.charAt(i+1);
if(Character.isLetter(c1) && Character.isLetter(c2)){
arr2.add(""+c1+c2);
}
}
ArrayList<String> union = new ArrayList<>(); // 합집합
ArrayList<String> intersection = new ArrayList<>(); // 교집합
for(String s : arr1){
if(arr2.remove(s)){
intersection.add(s);
}
union.add(s); // 교집합 빼고 넣기
}
for(String s : arr2){ // 나머지 arr2값 넣기
union.add(s);
}
int kyo = intersection.size();
int hab = union.size();
// kyo가 0일때 안되는 이유
// a,b가 있고 c가 있으면
// 교에 0들어가는 경우 , 합에 3인 경우
// 그럼 답이 0이 나와야하는데 65536이 나와서 오류 그래서 hab == 0 을 걸어줘야 함
// 테스트 케이스 5번이 그런경우 같은데 answer = 0;으로 보내서 검증 [ 통과 맞음 ]
if(hab == 0){
answer = 65536;
} else {
answer = (int)((double) kyo / (double)hab * 65536);
}
return answer;
}
}
Review🤩
정렬은 필요없다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] 멀리 뛰기 , 귤 고르기 (0) | 2024.04.23 |
---|---|
[프로그래머스] N개의 최소공배수 (1) | 2024.04.17 |
[프로그래머스] 오픈채팅방 (0) | 2024.01.22 |
[프로그래머스] 구명보트 (0) | 2024.01.16 |
[프로그래머스] 3월에 태어난 여성 회원 목록 출력하기 , 대여 기록이 존재하는 자동차 리스트 구하기 , 가격대 별 상품 개수 구하기 , 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.01.15 |