
프로그래머스 코딩테스트 입문 Java로 Day 22 dp 수학 조건문 배열 풀기
3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
| 10진법 | 3x 마을에서 쓰는 숫자 | 10진법 | 3x 마을에서 쓰는 숫자 |
|---|---|---|---|
| 1 | 1 | 6 | 8 |
| 2 | 2 | 7 | 10 |
| 3 | 4 | 8 | 11 |
| 4 | 5 | 9 | 14 |
| 5 | 7 | 10 | 16 |
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.
제한사항
n ≤ 100입출력 예
| n | result |
|---|---|
| 15 | 25 |
| 40 | 76 |
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= n; i++) {
answer++;
while (true) {
if (answer % 3 == 0 || answer % 10 == 3 || answer / 10 == 3 || answer / 10 % 10 == 3) {
answer++;
} else break;
}
}
return answer;
}
}
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
dots의 길이 = 4dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.입출력 예
| dots | result |
|---|---|
| [[1, 4], [9, 2], [3, 8], [11, 6]] | 1 |
| [[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
class Solution {
public int solution(int[][] dots) {
int answer = 0;
if (gradient(dots[0][0], dots[0][1], dots[1][0], dots[1][1]) == gradient(dots[2][0], dots[2][1], dots[3][0], dots[3][1]) || gradient(dots[0][0], dots[0][1], dots[2][0], dots[2][1]) == gradient(dots[1][0], dots[1][1], dots[3][0], dots[3][1]) || gradient(dots[0][0], dots[0][1], dots[3][0], dots[3][1]) == gradient(dots[2][0], dots[2][1], dots[1][0], dots[1][1])) answer = 1;
return answer;
}
public double gradient(int num1_x, int num1_y, int num2_x, int num2_y) {
return Math.abs((double)(num1_y - num2_y) / (num1_x - num2_x));
}
}
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
제한사항
lines의 길이 = 3lines의 원소의 길이 = 2lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.입출력 예
| lines | result |
|---|---|
| [[0, 1], [2, 5], [3, 9]] | 2 |
| [[-1, 1], [1, 3], [3, 9]] | 0 |
| [[0, 5], [3, 9], [1, 10]] | 8 |
import java.util.*;
class Solution {
public int solution(int[][] lines) {
int answer = 0;
int[] result = new int[202];
for (int i = 0; i < lines.length; i++) {
for (int count = -100; count <= 100; count++) {
if (lines[i][0] < count && lines[i][1] >= count) result[count+100]++;
}
}
for (int count = 0; count <= 201; count++) {
if (result[count] >= 2) {
answer++;
}
}
return answer;
}
}
처음에는 선이 지나가는 좌표에 +1을 하는 방식으로 했는데 그 방법을 사용하면 안되는 반례가 있었음. → 겹치는 부분이 [-1, 0], [1, 2]라고 할 때, 0과 1이 떨어져 있는지를 판별해줄 기믹이 없었음.
그래서 좌표에 +1을 하는게 아니라 좌표 사이의 선에 +1을 해줬음.
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
a, b는 정수a ≤ 1,000b ≤ 1,000입출력 예
| a | b | result |
|---|---|---|
| 7 | 20 | 1 |
| 11 | 22 | 1 |
| 12 | 21 | 2 |
Hint
class Solution {
public int solution(int a, int b) {
int answer = 1;
int gcd = GCD(a, b);
b /= gcd;
while (b != 1) {
if (b % 2 == 0) b /= 2;
else if (b % 5 == 0) b /= 5;
else {
answer = 2;
break;
}
}
return answer;
}
public int GCD(int num1, int num2) {
if (num1 < num2) {
int tmp = num2;
num2 = num1;
num1 = tmp;
}
if (num1 % num2 == 0) return num2;
else return GCD(num2, num1%num2);
}
}
우선 a와 b의 최대공약수를 구해 약분 → b의 소인수 구하기
최대공약수 구할때는 %
1) 생각보다 남의 코드를 흡수하는 방법이 도움이 되는 듯하다.
2) 기록표
