-
[백준/BOJ] 15903번 : 카드 합체 놀이 (JAVA / 자바)백준 2022. 2. 25. 22:01
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/15903
15903번: 카드 합체 놀이
첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,
www.acmicpc.net
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
카드의 개수 n개, 카드 합체 횟수 m번.
값이 적힌 카드가 n개있다. 이 중 작은 두 값을 구해서 더한 뒤 두 값에 더한 값을 저장한다. 이 행동을 m번 한다.
예를 들면 카드의 개수가 3개있고, 합체 횟수가 2번일때.
카드에 적힌 값은 1 5 3이다. 이 중 작은 값 두개는 1과 3이고, 두 값을 합쳐서 그 자리에 저장한다. 1 + 3은 4이고, 4를 저장하면 4 5 4다. 이렇게 한번한 것이고, 2번해야하기때문에 한번 더 반복한다.
4 5 4에서 작은 값 두개는 4와 4다. 4 + 4는 8이고, 저장하면 8 5 8이 된다. 이렇게 두번의 카드 합체가 끝났으니, 카드에 적힌 값들을 합해서 출력해준다. 8 5 8은 8 + 5 + 8 = 21이다. 출력 값은 21이 된다.
배열에 카드에 적힌 값들을 저장해준다.
m번 반복하는 반복문을 만들어준다. 반복할때마다 배열을 정렬해준다. 정렬을 하면 제일 작은 값 2개가 0과 1인덱스에 저장 될 것이다. 0인덱스 값과 1인덱스 값을 더해주고, 그 자리에 저장해준다.
반복이 끝나면 배열에 저장되어있는 값들을 다 합하고, 출력한다.
어렵진 않으나 틀린다면 보통 정수형의 범위를 틀리는 경우일 것이다.
1000개의 수가 있고, 1000*15인 15000번 반복하며, 값은 1000000까지 올 수있다. 얼추 봐도 int형을 넘어간다. 그러니 long형을 보자.
코드를 보자.
-풀이-
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); long[] arr = new long[n]; st = new StringTokenizer(br.readLine()); for(int i = 0; i < n; i++) { arr[i] = Integer.parseInt(st.nextToken()); } for(int i = 0; i < m; i++) { //정렬 Arrays.sort(arr); //정렬 후 최솟값 2개는 0과 1인덱스에 저장된 값 long N = arr[0] + arr[1]; arr[0] = N; arr[1] = N; } long sum = 0; for(int i = 0; i < n; i++) { sum += arr[i]; } System.out.println(sum); } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 9095번 : 1, 2, 3 더하기 (JAVA / 자바) (0) 2022.02.26 [백준/BOJ] 11399번 : ATM (JAVA / 자바) (0) 2022.02.25 [백준/BOJ] 2751번 : 수 정렬하기 2 (JAVA / 자바) (0) 2022.02.25 [백준/BOJ] 15552번 : 빠른 A+B (JAVA / 자바) (0) 2022.02.25 [백준/BOJ] 2577번 : 숫자의 개수 (JAVA / 자바) (0) 2022.02.25