0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오. 수학적 개념인 팩토리얼을 코드로 구현하는 문제였다. Answer 1) for(int i = N; i >= 1; i--) { result *= i; } 1부터 곱해가며 N까지 누적곱해도되지만, 여기서는 N부터 1까지 1씩 감소시키며 result에 누적곱해주었다. 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 Buffer..
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자. 랭킹 알고리즘과 유사하다. 1. 낮은 값이 높은 순위를 갖는다. (가장 높은 순위는 0순위다.) 2. 중복되는 원소는 같은 순위를 갖는다. 3. 낮은 값이 높은 순위를 갖는다는 것, 결국 순위를 정한다는 것은 오름차순으로 '정렬'을 했을 때 첫 번째 인덱스에 있는 원소가 가장 높은 순위를 갖고, 반대로 가장 마지막에 있는 원소가 가장 낮은 순위를 갖는다는 것을 의미 4. 여기서 우리는 순위를 매겨야..
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오. 1) 모든 원소들을 좌표별로 x를 오름차순 정렬하고, x가 같다면 y를 오름차순 정렬하라 2) 두 좌표를 모두 입력받았다고 가정해보자. 그리고 arr[i][0] 와 arr[i+1][0] 을 정렬할 것이고 만약 두 값이 같다면 arr[i][1] 과 arr[i+1][1] 을 비교할 것 >> 람다활용과 함께 Comparator를 오버라이딩하여 작성 첫번째 정렬 기준은 x좌표의 오름차순이고, x좌표가 같을 경우에는 y좌표의 오름차순 정렬을 해야한다. Answer 1) Arrays.sort(arr, (e1, e2) -> { if(e1[0] == e2[0])..
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자. 산술평균 : N개의 수들의 합을 N으로 나눈 값 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 최빈값 : N개의 수들 중 가장 많이 나타나는 값 범위 : N개의 수들 중 최댓값과 최솟값의 차이 N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오. 요구하는 산술평균, 중앙값, 최빈값, 범위를 구하는 문제이다. 나머지는 간단한 연산으로 구할 수 있다고 해도 최빈값을 구하는 부분에서 생각이 많아졌다. Try 1) BufferedReader br = new BufferedReader(new Inp..
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. >> 주의사항 : 시간 제한 이번 문제는 시간제한(=시간복잡도 고려)도 있지만, 수의 범위가 매우 크기때문에 배열의 크기를 10001크기로 선언한다. boolean배열로 선언하게 되면 중복으로 입력되는 데이터를 처리하기 힘들어진다. (인덱스로 접근하기 때문) Answer 1) int[] arr = new int[10001]; // 자연수를 입력받고, 0도 제외된 데이터이므로 1부터 시작 for(int i = 1; i < arr.length; i++) { // arr에 입력된 데이터가 있는 경우에만, 그 값을 StringBuilder에 누적 // StringBuilder에 누적시키면, 그만큼 arr은 카운트를 감소시킴 while(..
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오. 검은 영역의 넓이를 구하는 것이므로 겹치는 부분은 차감해주어야한다. Try 1) // 색종이의 수 int N = Integer.parseInt(br.readLine()); int[][] arr = new int[N][2]; // INPUT : 2차원배열과 각 좌표 for(int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine());..
9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오. 모든 인덱스를 돌며 max값을 찾아내야한다. 1열부터 찾아야하므로 x와 y 변수에 i + 1, j + 1을 각각 해준다. Answer 1) for(int i = 0; i = max) { max = arr[i][j]; // 1열부터 시작된다고 고지되어있으므로 +1을 해줌 x = i + 1; y = j + 1; } } } if(arr[i][j] >= max) 조건문으로 max값을 쉽게 찾아낼 수 있었다. import ..
N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오. N * M 크기의 행렬 두개가 주어지고 행렬의 덧셈을 수행해야한다. 각 인덱스에 맞게 더한 후 반환해야했다. Answer 1) for(int i = 0; i = N) { for(int j = 0; j < M; j++) { B[k][j] = Integer.parseInt(st.nextToken()); } k++; } // 2차원배열 A에 입력받기 else { for(int j = 0; j < M; j++) { A[i][j] = Integer.pa..
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오. >> 나이가 같으면 가입한 순(입력한 순)으로 출력 이또한 사전과 같은 프로그램을 만드는 문제였다. 1181번_단어정렬 문제와 유사하다. Try 1) BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); HashMap dic = new HashMap(); int N = Integer.parseInt(br.readLine()); String[] input2 = new String[N]; int max = 0; for(int i = 0;..