-
[백준/BOJ] 4690번 : 완전 세제곱 (JAVA / 자바)백준 2022. 2. 4. 20:26
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/4690
4690번: 완전 세제곱
페르마의 마지막 정리는, a, b, c가 0이 아닌 정수이고, n이 2보다 큰 자연수 일 때, an = bn + cn을 만족하는 자연수 a, b, c가 존재하지 않는다는 정리이다. 이 정리는 아직 증명되지 않았다. 하지만, 완
www.acmicpc.net
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
총 반복문 4개를 만든다. a b c d값에대한. 예제만 봐도 알겠지만 b c d는 a보다 작기 때문에 반복문은 a는 100이하, b c d는 a 미만으로 잡는다. 코드로 보면 이해하기 쉬울 것이다.
반복문은 a부터 d까지 순서대로 만들되 주의할 점은 출력을보면 a에 해당하는 bcd가 여러쌍 나올수 있다한다. 예제를 보면 a가 18일때가 그런 경우다. 그럴 경우 b작은 순서대로 출력되야 한다고 한다. 그렇다면 반복문을 할때 b가 2부터 시작을 하고 c 는 b부터 d는 c부터 반복을 시작하게 만들면 된다.
그리고 조건문으로 a 세제곱 = b 세제곱 + c 세제곱 + d 세제곱의 여부를 묻는다. 맞다면 출력값을 출력한다.
필자는 처음에 제출하고 나온 결과의 시간이 높게나와서 왜 높게 나오나 생각을 했다. 처음엔 그냥 변수들로 위 조건이 만족될 경우에 출력이 되게 만들었고, 시간이 많이 나와 StringBuilder를 이용했다. 시간이 90프로정도 줄었지면 여전히 매우 오래 걸리는 것을 확인하고, 필자는 세제곱을 Math.pow로 했기에 이것을 a*a*a = b*b*b + c*c*c + d*d*d로 바꿔보았다. 성공적으로 시간이 10프로까지 줄었다. Math,pow를 바꾼것보단 여기선 StringBuilder를 이용했을때와 이용하지 않았을때가 더 보는 사람들한테 도움이 될 것 같으니 두가지 코드를 올리겠다.
-풀이-
StringBuilder를 사용하지 않은 방법
public class Main { public static void main(String[] args) { //출력 문자열을 입력받고 마지막에 한번에 출력하기 위한 StringBuilder를 생성 StringBuilder sb = new StringBuilder(); //풀이 방법에서 설명한 4개의 반복문 for(int a = 2; a <= 100; a++) { for(int b = 2; b <= a; b++) { for(int c = b; c <= a; c++) { for(int d = c; d <= a; d++) { //완전세제곱일 경우에 출력문을 출력 if(a*a*a == b*b*b + c*c*c + d*d*d) { System.out.println("Cube = " + a + ", Triple = (" + b + "," + c + "," + d +")"); } } } } } } }
StringBuilder를 사용한 방법
public class Main { public static void main(String[] args) { //출력 문자열을 입력받고 마지막에 한번에 출력하기 위한 StringBuilder를 생성 StringBuilder sb = new StringBuilder(); //풀이 방법에서 설명한 4개의 반복문 for(int a = 2; a <= 100; a++) { for(int b = 2; b <= a; b++) { for(int c = b; c <= a; c++) { for(int d = c; d <= a; d++) { //완전세제곱에 해당하면 문자열을 sb에 저장. 저장할 길이가 길어서 두줄로 나눠서 저장 //저잘 할때마다 줄바꿈이 이루어져야하기 때문에 "\n"을 마지막에 저장 if(a*a*a == b*b*b + c*c*c + d*d*d) { sb.append("Cube = ").append(a).append(", Triple = (").append(b); sb.append(",").append(c).append(",").append(d).append(")").append("\n"); } } } } } System.out.println(sb); } }
-결과-
StringBuilder를 사용하지 않은 방법 StringBuilder를 사용한 방법
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 4880번 : 다음수 (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 4766번 : 일반 화학 실험 (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 4619번 : 루트 (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 4504번 : 배수 찾기 (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 4493번 : 가위 바위 보? (JAVA / 자바) (0) 2022.02.04