반응형

Java/백준알고리즘 111

[Java] 백준알고리즘 #10809 알파벳 찾기

입력한 단어의 각 알파벳들이 제일 먼저 나오는 위치를 찾는 문제이다. 먼저 비교를 위해 각 알파벳을 저장할 배열 a와 각 알파벳의 위치를 나타내 줄 b 배열을 만들어보자. char[] a = new char[26]; int[] b = new int[26]; for (int i = 0; i < 26; i++) { a[i] = (char) (97 + i); b[i] = -1; } 알파벳은 총 26자이므로 26만큼의 크기를 가진 배열 a, b 를 생성한다 그 후 배열 a에는 각 알파벳을 넣는다. 이때 소문자 a 는 아스키코드로 97에 해당하므로 97+i 를 char형으로 형변환하여 a[i] 에 담아주면 되겠다. 배열 b는 문제에서 등장하지 않는 알파벳은 -1로 표시하므로 -1로 초기화하였다. 이제 입력받은 문..

[Java] 백준알고리즘 #1436 영화감독 숌

666을 포함하는 수 중 가장 작은 수 부터 순서를 매겨 N번째의 수를 구하는 문제이다. 이를 해결하기 위해서는 i라는 변수를 두고 이 수를 1부터 차례로 증가시키며 이 수가 666을 포함하는지 안하는지를 확인하면 된다. 만약 666을 포함한다면 count를 증가시켜 count 와 n이 같아질 때의 i값이 n번째 영화 제목이 될 것이다. 이를 위해 while문을 이용한다. while(count != n) { if (check(i)) { count++; if (count == n) { System.out.println(i); } } i++; } 여기서 check() 메소드는 이 수가 666을 포함하는지 아닌지를 판별해 주는 함수이다. 이 함수의 반환값이 true일 때 count를 증가시키고, count가 ..

[Java] 백준알고리즘 #2750 수 정렬하기

입력받은 수들을 오름차순으로 정렬하여 출력하는 문제이다. 앞서 여러 문제들을 풀면서 사용했던 선택 정렬을 이용하면 되겠다. 2021.03.15 - [Java/백준알고리즘] - [Java] 백준알고리즘 #2798 블랙잭 [Java] 백준알고리즘 #2798 블랙잭 주어진 수들을 조합하여 3장의 카드를 골라 합이 m에 가장 근접하게 하는 문제이다. 이 문제는 선택정렬을 이용하여 풀면 간단하게 해결할 수 있다. 흔히 최소값, 최대값 또는 오름차순정렬 등을 sehyeok.tistory.com for (int i = 0; i a[j]) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; }..

[Java] 백준알고리즘 #1018 체스판 다시 칠하기

임의의 n x m 크기의 보드를 8 x 8 의 보드로 잘라내어 체스판을 만들기 위해 색상을 다시 칠하는 문제이다. 조금 단순하지만 무식한 방식으로 풀어보았다. 먼저 비교할 두 체스판 (흰색이 먼저 오는 체스판 과 검은색이 먼저 오는 체스판) 을 만들어둔다. char[][] b = new char[8][8]; char[][] w = new char[8][8]; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if ((i + j) % 2 == 0) { b[i][j] = 'B'; w[i][j] = 'W'; } else { b[i][j] = 'W'; w[i][j] = 'B'; } } } 그리고 n x m 크기의 보드를 이차원 배열에 입력받는다. int ..

[Java] 백준알고리즘 #7568 덩치

각 사람들의 키와 몸무게를 입력받고 등수를 매기는 문제이다. 먼저 각 사람들의 키와 몸무게를 저장할 2차원 배열 a를 만들어 몸무게와 키를 입력받는다. Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] a = new int[n][2]; int[] b = new int[n]; for (int i = 0; i < n; i++) { a[i][0] = sc.nextInt(); a[i][1] = sc.nextInt(); b[i] = 1; } a[i][0] 은 몸무게, a[i][1]은 키를 입력받도록 했다. b 배열은 등수를 저장할 배열이므로 1로 초기화 시켜주었다. 위 조건에는 키와 몸무게가 더 많이 나간다면 덩치가 크다고 했다. 이 덩치를 이..

[Java] 백준알고리즘 #2231 분해합

어떤 자연수 n이 있을 때 n과 n의 각 자리수를 더한 것을 분해합이라고 하고, 이 분해합을 A라고 할 때 n은 A의 생성자가 된다고 한다. 임의의 자연수 n, 즉 분해합 n이 주어졌을 때 생성자 m을 구하는 문제이다. 각 자리수를 더하는 방법만 알고 있다면 아주 쉽게 해결 할 수 있는 문제이다. 임의의 정수 i가 있을 때 각 자리수를 더하는 방법은 다음과 같다. while(i > 0){ sum += i % 10; i = i / 10; } 합을 저장할 sum변수에 i를 10으로 나눈 나머지를 넣은 후 다시 i에 i를 10으로 나눈 몫을 저장한다. 만약 789라면 1. 798를 10으로 나눈 나머지인 9가 sum에 저장됨 2. i에 789를 10으로 나눈 몫인 78이 저장됨 3. 78을 10으로 나눈 나머..

[Java] 백준알고리즘 #2798 블랙잭

주어진 수들을 조합하여 3장의 카드를 골라 합이 m에 가장 근접하게 하는 문제이다. 이 문제는 선택정렬을 이용하여 풀면 간단하게 해결할 수 있다. 흔히 최소값, 최대값 또는 오름차순정렬 등을 할 때 많이 사용되는 선택정렬은 1회전에서 1번 원소를 2번 원소부터 시작해 3,4 ... n번째 원소까지 비교하고 2회전에서 2번 원소를 3번 원소부터 시작해 4,5 ... n번째 원소까지 비교하는 방식이다. 이 선택정렬을 이용한다면 1~5까지의 수 중 2개를 뽑아내어 만들 수 있는 순서쌍을 구할 수 있다. 예시를 보자 int[] a = { 1, 2, 3, 4, 5 }; for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { Sys..

[Java] 백준알고리즘 #1002 터렛

두개의 좌표 (x1, y1) (x2, y2) 와 이 두 좌표로부터의 거리 r1, r2가 주어질 때 임의의 점 a (a, b) 가 존재할 수 있는 좌표의 수를 출력하는 문제이다. 계산을 편하게 하기 위해 두 점사이의 거리를 저장해두는 변수를 만들어준다. int dis2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); 제곱근을 구하려면 Math함수를 사용해야 하므로 피타고라스 공식을 이용하여 거리의 제곱을 저장해두자. 먼저 두 점과 r1, r2 가 일치할 때에는 a가 존재할 수 있는 좌표의 수는 무한대가 된다. if (x1 == x2 && y1 == y2) { if (r1 == r2) { System.out.println(-1); } } 때문에 위와 같이 이 경우의 수..

[Java] 백준알고리즘 #3053 택시 기하학

택시 기하학에서 두 점 사이의 거리가 위 조건과 같을 때, 주어진 반지름을 가진 원의 넓이를 구하는 문제이다. 언뜻 보면 복잡해 보이는 문제이지만 간단하다. 원의 정의가 유클리드 기하학과 같기 때문에 먼저 택시 기하학에서 두 점 사이의 거리가 같은 점들을 구해본다. 예를 들어 반지름이 1일 경우 유클리드 기하학에서 원은 다음과 같이 표현할 수 있다. 하지만 택시 기하학에서는 두 점사이의 거리가 |x1 - y1| + |x2 - y2| 이므로 이 거리가 1이 되는 순서쌍에는 (1, 0) (0.5, 0.5) (0, 1) (-0.5, 0.5) ... 등이 있다. 이를 그림으로 나타내보면 다음과 같다. 즉 택시 기하학에서 반지름이 r인 원 (한 점으로부터 거리가 같은 점들의 집합) 의 넓이는 대각선이 2*r 인 ..

[Java] 백준알고리즘 #4153 직각삼각형

피타고라스의 정리를 이용하여 직각삼각형인지 아닌지를 판별하는 문제. 매우 간단하다. a, b, c 값을 입력 받은 후 𝑎² = 𝘣² + 𝘤² 를 만족하는지만 확인하면 된다. 먼저 a, b, c 값이 0이라면 반복문이 종료되므로 break문을 이용해 0을 입력받으면 빠져나갈 수 있게 해 둔다. if (a == 0 && b == 0 && c == 0) break; 그 후 a, b, c 중 어떤 값이 대각선인지 모르기 때문에 if문을 활용하여 3가지의 경우로 나눈다 a가 대각선이라면 𝑎² = 𝘣² + 𝘤² b가 대각선이라면 𝘣² = 𝑎² + 𝘤² c가 대각선이라면 𝘤² = 𝑎² + 𝘣² 가 되겠다. 이를 코드로 작성해보면 다음과 같다. import java.util.Scanner; public class Ba..

반응형