[백준/BOJ] 3004번 : 체스판 조각 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/3004
3004번: 체스판 조각
상근이는 3003번에서 동혁이가 발견한 체스판을 톱으로 자르려고 한다. 상근이는 체스판을 최대 N번 자를 수 있으며, 변에 평행하게만 자를 수 있다. 또, 자를 때는 체스판의 그 변의 한쪽 끝에서
www.acmicpc.net
- 문제 -
난이도 브론즈 4 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
체스판을 자를때마다 패턴이 있는데
1번 자르면 2개가 되고
2번 자르면 4개가 되고 1번에서 2번으로 늘어나면 조각은 2개가 늘어난다
3번 - 6개 2개가 늘어난다
4번 - 9개 3개가 늘어난다
5번 - 12개 3개가 늘어난다
6번 - 16개 4개가 늘어난다
이렇듯 패턴을 가지고 증가한다.
패턴은 보면 자르는 횟수가 늘어날때마다 조각의 증가량이 2번 같고 그 다은 하나 증가 다시 2번 같다.
그리고 보면 3번 자를때 2개가 늘어나고 4번 자를땐 3개가 늘어난다. 다른 숫자들도 보면 알겟지만
이걸로 또 파악할 수 있는 패턴은 각 자르는 횟수를 2로 나눠서 1을 더하면 그게 바로 조각의 증가량이다.
그래서 이 패턴을 이용해 코드를 짜 볼 것이다.
for문을 이용해 N번 만큼 자르고, 자를 때마다 각 자를때의 번호를 2로 나누고 1을 더해서 총 조각 수에 더 할 것이다.
자세한건 코드로 확인해 보자.(코드로 두가지 방법을 보여줄 것이다. 크게 다른건 아니고 if문을 추가해서 쓰는것과 없이 쓰는 것이다.)
-풀이-
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());
int sum = 0;
//보통 for문에서 i는 0부터 시작하지만 여기선 좀 더 직관적으로 보고
//연산하기 편하게 1부터 시작한다(1부터 하므로써 i는 자를때마다 자르는 번호가 된다)
for(int i = 1; i <= N; i++) {
//첫번째 자를때는 2로 나누고 1을 더하면 1이 되어버리기 때문에 if문으로 제한해준다.
if(i == 1) {
sum += 2;
}else {
sum += ((i / 2) + 1);
}
}
System.out.println(sum);
}
}
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일때 어짜피 다른 횟수와 다르게 단순하게 2를 더해주기 때문에
//애초에 합 변수에 2를 포합시켜준다.
int sum = 2;
//1번일때는 합산에 이미 추가했기 때문에 i는 2부터 시작한다.
for(int i = 2; i <= N; i++) {
sum += ((i / 2) + 1);
}
System.out.println(sum);
}
}
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠다.