문제 url:
중앙 이동 알고리즘
문제:
1. BufferedReader를 이용해 입력을 받는다.
2. 몇번 째를 나타낼 것인지를 묻는 변수 N을 생성(해당 값은 반복문에 사용)
3. 초기 값 2를 넣을 변수 d 생성
4. 1, 2, 4, 8.. 누적합을 더할 반복문 생성
5. 제곱한 값을 int형으로 변환 후 출력
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 2. 반복할 횟수
int n = Integer.parseInt(br.readLine());
// 3. 초기값 점 저장
int d = 2;
// 4. 1, 2, 4, 8 누적합을 더할 반복문
for (int i = 1; i <= n; i++) {
d = (int) (d + Math.pow(2, i-1));
}
// 5. 제곱한 값을 int형으로 변환
int result = (int)Math.pow(d,2);
System.out.println(result);
br.close();
}
}
다시 한번 수학적 지식이 많이 부족하다는 것을 느끼고 있다. 이런 문제에서 빠르게 규칙성을 찾는 연습이 많이 필요하다는 것을 느꼈다.
위의 방법대로 푸니깐. 시간이 많이 걸렸다. 그래서 더 나은 방법을 찾아나섰고 역시나 좋은 코드는 구글에 많이 존재하였다.
반성하는 마음으로 코드 리팩토링
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1. 반복할 횟수
int n = Integer.parseInt(br.readLine());
// 2. 2^ 2, 3^2, 5^2, 9^2승은 곧 (2^n+1) ^ 2승의 값과 같다.
// 여기서 n은 아까 입력받았던 위의 n과 동일
System.out.println((int)Math.pow(Math.pow(2,n)+1,2));
br.close();
}
}