https://www.acmicpc.net/problem/29812
❓문제
이 문제에서 주의해야할 점은 무조건 delete와 드래그 조합이 delete를 여러번 하는 것보다 적은 에너지를 소비할 것 같은데 그렇지 않다는 점이다.
예를들어) D = 2, M = 10 인 경우, HYU가 아닌 글자의 연속된 수가 3이라면 delete를 3번 하는 것이 6의 에너지를 소비하고 delete와 드래그 조합은 12의 에너지를 소비하게 되어 delete를 여러번하는 것이 훨씬 적은 에너지를 소비한다.
그래서, 어느 경우 더 적은 에너지를 소비하는게 좋은지 계산을 해야한다.
⭕정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String str = br.readLine();
StringTokenizer st = new StringTokenizer(br.readLine());
int d = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int cnt=0; //H,Y,U가 아닌 글자의 연속 갯수를 카운팅
int energy=0; //김한양이 소비한 에너지
int cntH=0, cntY=0, cntU=0;
for (int i=0; i<n; i++) {
char c = str.charAt(i);
if (c!='H' && c!='Y' && c!='U') {
cnt++;
//H,Y,U로 끝나지 않을 경우
if (i == n-1) {
energy += calculate(cnt, d, m);
}
} else {
//H,Y,U가 아닌 글자가 있다면 에너지를 증가해준다.
if (cnt>0) {
energy += calculate(cnt, d, m);
} else if (cnt>0) {
energy += d;
}
//에너지를 추가해줬으므로 해당 글자들은 삭제한다.
cnt=0;
if (c=='H') {
cntH++;
} else if (c=='Y') {
cntY++;
} else {
cntU++;
}
}
}
//소비한 에너지가 0이라면 Nalmeok을 출력한다.
if (energy>0) {
System.out.println(energy);
} else {
System.out.println("Nalmeok");
}
// H,Y,U 중 최소값을 찾아 최대 조합 가능한 수로 출력한다.
int min = Math.min(cntY, cntU);
min = Math.min(cntH, min);
if (min==0) {
System.out.println("I love HanYang University");
} else {
System.out.println(min);
}
}
//d+m 보다 d 여러번하는게 더 적은 에너지가 드는 경우를 계산하는 함수
private static int calculate(int cnt, int d, int m) {
if (cnt * d < d+m ) {
return cnt * d;
}
return d+m;
}
}
❗결과
'코딩테스트 > 백준' 카테고리의 다른 글
[코테] 백준 10250번 : ACM 호텔 (java) (0) | 2023.10.29 |
---|---|
[코테] 백준 2587번 : 대표값2 (java) (0) | 2023.10.28 |
[코테] 백준 25206번 : 너의 평점은 (java) (0) | 2023.10.28 |
[코테] 백준 29813번 : 최애의 팀원 (java) (0) | 2023.09.24 |
[코테] 백준 29807 학번을 찾아줘 (java) (0) | 2023.09.22 |