1. 문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
2. 예시
3. 풀이
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int cnt = 1;
int sum = 1;
while(true){
if(sum >= num){
break;
}
sum += (cnt*6);
cnt++;
}
bw.write(cnt + "\n");
bw.flush();
bw.close();
br.close();
}
}
4. 메모
- 반복되는 규칙을 찾는 것이 중요
1) 벌집은 6면체 => 다음줄로 갈 때 마다 6개씩 갯수가 늘어남
1개 -> 6개 -> 12개 -> 18개 ->...
2) 벌집안의 숫자는 누적하여 늘어남
1 (0*6) -> 7 ((0*6) + (1*6)) -> 19 ((0*6) + (1*6) + (2*6)) ->... - 다른 답안들
1) 뺄셈으로 정답 구하기
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()) - 1;
int cnt = 1;
while(n > 0) {
n -= (6 * cnt);
cnt++;
}
bw.write(cnt + "\n");
bw.flush();
bw.close();
br.close();
}
}
2) 덧셈 방식인데 좀 더 간결하게 (조건문이 달라짐!)
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int cnt = 1;
int sum = 1;
while(sum < num){
sum += (cnt*6);
cnt++;
}
bw.write(cnt + "\n");
bw.flush();
bw.close();
br.close();
}
}
'공부 > CodingTest' 카테고리의 다른 글
[프로그래머스/SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2023.07.16 |
---|---|
[프로그래머스/SQL] 조건에 부합하는 중고거래 댓글 조회하기 (1) | 2023.07.16 |
[백준/1712] 손익분기점 (Java 11) (0) | 2022.11.21 |
[프로그래머스] 신규 아이디 추천 (0) | 2021.08.09 |
[프로그래머스] 1주차 (0) | 2021.08.09 |