일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- React.js
- 노마드코더
- React
- ReactJS로 영화 웹 서비스 만들기
- SoftwareExpertAcademy
- Stack
- 달빛클럽1기
- 달빛클럽
- dfs
- 카카오블라인드코딩테스트
- 달빛클럽 1기
- HashMap
- 프로그래머스
- Java
- 리액트
- 완전탐색
- 재귀
- 백준
- 알고리즘
- 노마드코더 강의
- 자바
- programmers
- Array
- JPA
- Algorithm
- 달빛캠퍼스
- 인플레이션에서 살아남기
- SWEA
- 경제공부
- BOJ
- Today
- Total
th42500의 TIL
[Java] 연습문제 - 숫자 카드 나누기(Lv 2) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/135807
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✔ 입출력 예시
💡 포인트
1️⃣ 각 배열(철수, 영희) 배열의 원소를 모두 나눌 수 있는 양의 정수 a 구하기 👉 각 배열의 최대공약수
2️⃣ 각 상대 배열(영희, 철수) 배열의 원소를 모두 나눌 수 없는 양의 정수 a 구하기
3️⃣ arrayA와 arrayB의 길이는 같음
4️⃣ arrayA와 arrayB에는 중복된 원소가 있을 수 있음
❓ 풀이과정
1️⃣ 철수와 영희의 최대공약수를 담는 변수에 각 배열의 첫번째 원소 담기
2️⃣ 각 배열의 길이가 1보다 클 경우에만 배열을 순회하며 최대공약수 구하기
👉 배열의 길이가 1이라면 최대공약수 역시 0번째 원소와 같기 때문
👉 최대공약수 구하는 알고리즘 : 유클리드 호제법
3️⃣ 두 배열은 길이가 같으므로 arrayA 또는 arrayB의 길이만큼 반복문을 순회하며 2️⃣에서 구한 최대공약수로 서로의
배열의 원소 중 하나라도 나누어떨어진다면 최대공약수의 값을 0으로 바꾸기
4️⃣ 두 최대공약수 변수 중 가장 큰 값을 return
👉 3️⃣에서 두 최대공약수 모두 서로의 배열의 원소를 나눈 결과 나머지가 없었다면 0으로 바뀌어 조건을 만족하는
a가 없는 경우 0을 return한 것과 같게 됨
✔ 소스코드
public class Solution {
private int solution(int[] arrayA, int[] arrayB) {
int chulsu = arrayA[0];
if(arrayA.length > 1) {
for (int i = 1; i < arrayA.length; i++) {
chulsu = gcd(chulsu, arrayA[i]);
}
}
int yeonghui = arrayB[0];
if(arrayB.length > 1) {
for (int i = 1; i < arrayB.length; i++) {
yeonghui = gcd(yeonghui, arrayB[i]);
}
}
for (int i = 0; i < arrayA.length; i++) {
if(chulsu != 0 && arrayB[i] % chulsu == 0) {
chulsu = 0;
}
if(yeonghui != 0 && arrayA[i] % yeonghui == 0) {
yeonghui = 0;
}
}
return Math.max(chulsu, yeonghui);
}
private int gcd(int small, int big) {
if(small > big) {
int temp = small;
small = big;
big = temp;
}
if(small == 0) {
return big;
}else {
return gcd(small, big%small);
}
}
public static void main(String[] args) {
Solution main = new Solution();
// result = 0
int[] arrayA = {10, 17};
int[] arrayB = {5, 20};
// result = 10
/*int[] arrayA = {10, 20};
int[] arrayB = {5, 17};*/
// result = 7
/*int[] arrayA = {14, 35, 119};
int[] arrayB = {18, 30, 102};*/
/*int[] arrayA = {10, 30};
int[] arrayB = {5, 10, 39};*/
System.out.println(main.solution(arrayA, arrayB));
}
}
❗ 실행 결과
유클리드 호제법으로 풀어야한다는 것은 떠올렸지만 유클리드 호제법 구현하는 법이 헷갈려 다시 공부해야했던 문제😂
유클리드 호제법은 매번 small의 값을 big에 담아줘야했던건지, 나머지값을 small에 담아줘야했던건지 헷갈려 구글링을 다시 하게 되는 알고리즘이다...
앞으로도 꾸준히 연습해서 헷갈리지 않을 수 있게 해야지 😊
'Algorithm > Programmers' 카테고리의 다른 글
[Java] 연습문제 - 제일 작은 수 제거하기 (Lv 1) (0) | 2022.12.16 |
---|---|
[Java] 연습문제 - 명예의 전당 (1) (Lv 1) (0) | 2022.12.01 |
[Java] 2018 KAKAO BLIND RECRUITMENT - [1차] 비밀지도 (feat. StringIndexOutOfBoundsException) (Lv 1) (0) | 2022.11.11 |
[Java] 깊이/너비 우선 탐색(DFS/BFS) - 여행경로 (Lv3) (0) | 2022.10.09 |
[Java] 완전탐색 - 카펫 (Lv2) (0) | 2022.09.19 |