https://school.programmers.co.kr/learn/courses/30/lessons/17677
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
두 개의 문자열이 주어졌을 때 두 문자열을 2음절로 나누어 (공통부분)/(전체) 의 값을 구하는 문제이다.
내가 생각한 방법은 HashMap<String, Integer> 형식으로 첫번째 문자열을 담은 다음 두번째 문자열을 빼내어 공통부분을 구하는 식으로 생각을 했었다.
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
double Acnt = 0;
double Bcnt = 0;
double allcnt = 0;
for(int i = 0; i < str1.length()-1; i++) {
String str = "";
if('A' <= str1.charAt(i) && 'Z' >= str1.charAt(i) && 'A' <= str1.charAt(i+1) && 'Z' >= str1.charAt(i+1)) {
str += str1.charAt(i);
str += str1.charAt(i+1);
Acnt++;
hm1.put(str, hm1.getOrDefault(str, 0)+1);
}
}
for(int i = 0; i < str2.length()-1; i++) {
String str = "";
if('A' <= str2.charAt(i) && 'Z' >= str2.charAt(i) && 'A' <= str2.charAt(i+1) && 'Z' >= str2.charAt(i+1)) {
str += str2.charAt(i);
str += str2.charAt(i+1);
if(hm1.containsKey(str)) {
Acnt--;
allcnt++;
hm1.put(str, hm1.getOrDefault(str, 0)-1);
if(hm1.get(str) == 0) hm1.remove(str);
} else {
Bcnt++;
}
}
}
double result = allcnt/(Acnt+allcnt+Bcnt);
answer = (int)(result * 65536);
if(answer == 0 ) answer = 65536;
return answer;
}
}
그런데..
정확성 부분에서 오류가 발생....
도대체 뭐가 문제인지 몰라서 한참을 고민했다.
답은 생각보다 간단한 곳에 있었다..
변수 선언부분을 고치니 정답... 사소한 것도 신경을 써야한다..(오늘의 교훈)
public int solution(String str1, String str2) {
int answer = 0;
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
float Acnt = 0;
float Bcnt = 0;
float allcnt = 0;
for(int i = 0; i < str1.length()-1; i++) {
String str = "";
if('A' <= str1.charAt(i) && 'Z' >= str1.charAt(i) && 'A' <= str1.charAt(i+1) && 'Z' >= str1.charAt(i+1)) {
str += str1.charAt(i);
str += str1.charAt(i+1);
Acnt++;
hm1.put(str, hm1.getOrDefault(str, 0)+1);
}
}
for(int i = 0; i < str2.length()-1; i++) {
String str = "";
if('A' <= str2.charAt(i) && 'Z' >= str2.charAt(i) && 'A' <= str2.charAt(i+1) && 'Z' >= str2.charAt(i+1)) {
str += str2.charAt(i);
str += str2.charAt(i+1);
if(hm1.containsKey(str)) {
Acnt--;
allcnt++;
hm1.put(str, hm1.getOrDefault(str, 0)-1);
if(hm1.get(str) == 0) hm1.remove(str);
} else {
Bcnt++;
}
}
}
float hab = Acnt + Bcnt+allcnt;
double f = 0d;
if(hab == 0) {
answer = 1 * 65536;
} else {
f = allcnt/hab;
answer= (int)(f*65536);
}
System.out.println(answer);
return answer;
}
'코딩테스트 > programmers' 카테고리의 다른 글
[level3] 정수 삼각형 JAVA (0) | 2022.11.21 |
---|---|
[level2] 2018 KAKAO BLIND RECRUITMENT[3차] 압축 JAVA (0) | 2022.11.16 |
[level2] 주차 요금 계산 JAVA (0) | 2022.11.15 |
[JAVA] 3진법 뒤집기 (0) | 2022.09.16 |
문자열 내 마음대로 정렬하기 (0) | 2022.08.24 |