2024.06.19기준 - 실버1
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 제시된 조건으로 몇 초 안에 주어진 문장을 만들 수 있는지 계산하는 문제입니다.
이 문제의 조건은 2가지 있습니다.
- 알파벳 소문자 a부터 z 중에서 민우가 원하는 알파벳을 하나 골라서 지금까지 입력한 내용의 맨 뒤에 입력한다.
- 지금까지 입력한 문자열의 연속된 부분 문자열을 복사 후 입력한 내용의 맨 뒤에 붙여 넣는다.
저의 접근 방식은
1. 일단 처음 daldidalgo를 입력하는데 사용하는 시간을 계산했습니다.
daldi 까지는 복사를 하든 안하든 동일하게 5초가 흐르게 됩니다.
그 다음 dal을 할때에는 이미 dal를 입력한 이력이 있기 때문에 복사를 해서 사용합니다.
그렇게 첫 daldidalgo를 입력할 때에는 총 8초가 지나게 됩니다.
2. 두 번째 daldidalgo를 입력 후 마지막 daldidan까지 입력하는데 2가지 조건이 들어갑니다.
기본적으로 복사를 하면 할 수록 daldidalgo가 많아져 여러개를 만드는데에 시간이 줄어듭니다.
여기서 마지막 daldidan을 만드는데 2가지로 나뉘어 집니다.
2-1. daldidalgo가 2의 배수라면 daldidan을 만드는데 2초가 소모됩니다. (daldian → 복사 / n → 입력)
2-2. daldidalgo가 2의 배수가 아니라면 daldidan을 만드는데 1초가 소모됩니다. (...daldian → 복사 / n → 입력)
총 정리는 2의 배수라면 n - Math.pow(2, m)이 음수가 되지 않는 선에서 가장 큰 값에 마지막 2초를 추가 해줍니다.
하지만 2의 배수가 아니라면 마지막 daldida까지도 복사가 가능하기 때문에 n - Math.pow(2, m)이 음수가 되지 않는 선에서 가장 큰 값에 마지막 1초를 추가 해 줍니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // daldidalgo의 횟수
// 첫 daldidalgo를 만들때 8초가 소모된다.
int count = 8;
for (int i = 1; ; i++) {
if (n - Math.pow(2, i) == 0) {
count = count + i + 2; // 복사를 i번, daldidan만드는데 2초 소모된다.
break;
} else if (n - Math.pow(2, i) < 0) {
count = count + i + 1; // 복사를 i번, daldidan만드는데 1초 소모된다.
break;
}
}
bw.write(Integer.toString(count));
bw.flush();
bw.close();
br.close();
}
}
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31882번 근수 (2) | 2024.06.10 |
---|---|
BAEKJOON / 백준 - JAVA 31881번 K512에 바이러스 퍼뜨리기 (0) | 2024.06.09 |
BAEKJOON / 백준 - JAVA 31872번 강의실 (0) | 2024.05.31 |
BAEKJOON / 백준 - JAVA 31870번 버블버블 (0) | 2024.05.30 |
BAEKJOON / 백준 - JAVA 31869번 선배님 밥 사주세요! (2) | 2024.05.29 |