-
[백준/BOJ] 7770번 : 아즈텍 피라미드 (JAVA / 자바)백준 2022. 2. 7. 15:11
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/7770
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
피라미드 간단히 생각하자. 안정적인이라 했지만 결국 그냥 마름모꼴로 계삭 쌓아간단 건데. 위로 쌓는것이 아니라 기존에 쌓여있는걸 위로 올리고 아래에 새로 블록을 깐다 생각하자.
처음에 1개의 블록이 있으면 1개 아래에 위 아래 좌우 하나씩 4개를 추가해서 총 5개의 블록을 추가한다. 그렇게 되면 총 블록의 갯수는 6개.
다음에 6개 아래에 방금 추가한 5개 테두리에 블록 8개를 더 추가해서 총 13개의 블록을 추가한다. 그렇게되면 총 블록의 갯수는 19개.
다음엔 19개 아래에 방금 추가한 13개 테두리에 블록 12개를 추가해서 총 25개의 블록을 추가한다. 그렇게되면 총 블록의 갯수는 44개.
이렇듯 높이가 올라갈 수록 바닥에 이저에 추가한 갯수의 4의 배수가 더해져서 깔린다.
좀 더 정리해 보자.
0 > 1 > 6 > 19 > 44
0 > 1 = 1개 / 1 > 6 = 5개 / 6 > 19 = 13개 / 19 > 44 = 25개 / ...
이렇게 되는 것이다.
그렇다면 입력된 블록의 갯수를 쌓았을때 높이를 확인 하는 방법은 저렇게 갯수를 반복문을 이용해 쌓아가다가 현재 블록의 갯수가 n보다 커지거나 같다면 그때의 높이의 -1이 될 것이다.
입력값이 몇인지도 모르고 몇번째까지 반복문을 돌려야 하는지 모르기 때문에 무한루프를 사용.
블록의 갯수 n이 현재 높이의 최소 블록의 갯수 A보다 커지면 무한루프 종료.
반복될때마다 추가할 블록의 갯수 B에 곱하기 현재 높이의 -1인 i값을 해준다.
코드로 보자.
-풀이-
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); //현재 블록의 갯수가 1개면 추가된 블록의 수도 1개이기 때문에 A B 둘다 1로 저장 int A = 1; int B = 1; //층 -1의 값을 저장 할 변수. //만약 무한루프에서 i에 +1을 먼저 해주면 0으로 저장해야하지만 필자는 마지막에 +1을 해주기때문에 1로 저장. int i = 1; //무한 루프 while(true) { B += 4 * i; A += B; if(A > n) { break; } i++; } System.out.println(i); } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 9063번 : 대지 (JAVA / 자바) (0) 2022.02.08 [백준/BOJ] 7789번 : 텔레프라임 (JAVA / 자바) (0) 2022.02.07 [백준/BOJ] 7510번 : 고급 수학 (JAVA / 자바) (0) 2022.02.07 [백준/BOJ] 6609번 : 모기곱셈 (JAVA / 자바) (0) 2022.02.07 [백준/BOJ] 6378번 : 디지털 루트 (JAVA / 자바) (0) 2022.02.06