63. 겹치는 선분의 길이
class Solution {
public int solution(int[][] lines) {
int answer = 0;
int[] arr = new int[200];
for(int i=0; i<lines.length; i++){
for(int j = lines[i][0] + 100; j< lines[i][1] + 100; j++){
arr[j] ++;
}
}
for(int i=0; i<200; i++){
if(arr[i] > 1) answer++;
}
return answer;
}
}
<작성한 코드>
-100 <= a < b <=100 이기 때문에 200의 길이를 가진 정수형 배열을 하나 만들었다. 그 후 lines의 길이만큼 반복시켰고, 시작점 [i][0]부터 끝점 [i][1]까지의 거리를 구했다. +100을 해준 이유는 음수가 나올 수도 있기 때문에 해줬다. 그리고 그 값을 미리 만들어둔 arr [j]에 넣어줬다. 이렇게 하면 시작점과 끝값에 해당하는 원소가 1 증가한다. 그다음 두 번째 for문에서는 겹치는 부분의 길이를 구한다. arr의 길이만큼 반복해 주고 arr [i]에 해당하는 원소가 1보다 크게 되면 answer++를 해준다. 간단히 말하자면 1부터 200까지의 포인트에 각 선이 지나간 곳에 +1을 해준다. 그리고 만약 2번 이상 지나가서 +2가 되어있다면 겹치는 부분이기 때문에 이것들의 개수만 더해줬다.
64. 유한소수 판별하기
class Solution {
public int solution(int a, int b) {
int answer = 0;
int gcd = gcd(a,b);
b /= gcd;
while(b%2 == 0){
b /= 2;
}
while(b%5 == 0){
b /= 5;
}
if(b == 1) answer = 1;
else answer = 2;
return answer;
}
public int gcd(int a, int b){
while(b!=0){
int temp = a % b;
a = b;
b = temp;
}
return a;
}
}
<작성한 코드>
gcd는 원래 최대공약수를 구하는 함수이다. 직접 구현해 봤다. 유클리드? 호제법을 쓰면 a, b의 최대공약수는 b, a%3이다. 원래 b를 넣었던 자리에 0이 들어가게 되면 그 왼쪽에 있는 값이 최대공약수다. 이렇게 gcd 함수를 구현했다. 그리고 변수 gcd에 a, b의 최대공약수를 넣어줬다. 이 상태로 b에는 b / 최대공약수를 해준 뒤 넣어주었다. 그다음 아래 2개의 while문으로 b가 2,5로 나누어 떨어질 때 나눠줘서 b의 값을 1로 설정했다. 만약 1이 아니라면 answer에는 2를 넣어주고 반환했다.
65. 특이한 정렬
import java.util.*;
class Solution {
public int[] solution(int[] numlist, int n) {
int[] answer = new int[numlist.length];
Integer[] result = new Integer[numlist.length];
for(int i=0; i<numlist.length; i++){
result[i] = numlist[i] - n;
}
Arrays.sort(result, new Comparator<Integer>(){
@Override
public int compare(Integer a, Integer b){
int A = Math.abs(a);
int B = Math.abs(b);
if(A == B){
return b - a;
}
return A - B;
}
});
for(int i=0; i<result.length; i++){
answer[i] = result[i] + n;
}
return answer;
}
}
<작성한 코드>
numlist의 길이와 같은 크기를 가진 result배열을 생성했다. 그 후 for문으로 result배열 안에 각원소에서 n을 빼줬다. 그 뒤 Arrays.sort를 사용하여 result을 정렬했다. 그 후 a, b의 절댓값을 A, B에 저장하였다. 만약 절댓값이 같으면 큰 수를 반환하도록 했다. 그 뒤 값을 반환하기 위해 아까 기존값에 n을 더해줬으니 다시 -n을 해주고 배열을 반환하였다.
66. 등수 매기기
import java.util.*;
class Solution {
public int[] solution(int[][] score) {
int[] result = new int[score.length];
int[] answer = new int[score.length];
for(int i=0; i<score.length; i++){
int sum = 0;
for(int j=0; j<score[i].length; j++){
sum += score[i][j];
}
result[i] = sum;
}
for(int i=0; i<result.length; i++){
int rank = 1;
for(int j=0; j<result.length; j++){
if(result[i] < result[j]){
rank++;
}
}
answer[i] = rank;
}
return answer;
}
}
<작성한 코드>
result배열을 생성해서 각 점수의 합을 넣어줬다. 평균을 구하려면 나눠야하지만 어차피 합으로 순위를 구하나 평균으로 순위를 구하나 예외사항은 없다고 생각돼서 결정했다. 합을 result 배열에 차례로 넣어준 뒤 두 번째 중첩 for문에서 순위를 정해줬다. rank값을 1로 정해두고 자신보다 큰 수가 있으면 1씩 더해줬다. 그 뒤 answer배열에 rank값을 넣어줘서 반환했다.
67. 로그인 성공?
class Solution {
public String solution(String[] id_pw, String[][] db) {
String answer = "";
for(int i=0; i<db.length; i++){
if(id_pw[0].equals(db[i][0]) && id_pw[1].equals(db[i][1])){
return "login";
}
}
for(int i=0; i<db.length; i++){
if(id_pw[0].equals(db[i][0])){
return "wrong pw";
}
}
for(int i=0; i<db.length; i++){
if(id_pw[1].equals(db[i][1])){
return "fail";
}
}
return answer;
}
}
<작성한 코드>
id_pw의 [0]번쨰엔 id가 들어있고 [1] 번째에는 비밀번호가 들어있다. 때문에 첫 번째 for문에서는 id_pw배열 안의 id값과 db의 id값이 일치하는지 찾는다. 또한 일치하면서 pw값까지 같다면 login을 반환해 줬다. 두 번째 for문에서는 id_pw의 첫 번째 값만 확인해 줬다. 바로 return을 안 해줬다면 중복돼서 걸렸겠지만 이미 위에서 return 해줬기 때문에 여기서는 아이디, 비밀번호가 둘 다 일치하는 경우가 없다. 따라서 아이디가 일치하는 게 있으면 wrong pw를 반환해 줬다. 세 번째 for문은 사실 생략하고 초기에 answer에 fail을 선언해 줘도 됐었다. 그래도 나는 일단 작성해 봤다. 생각보다 간단했다.
68. 치킨 쿠폰
class Solution {
public int solution(int chicken) {
int answer = 0;
while(chicken >= 10){
int addChicken = chicken / 10;
int leftChicken = chicken % 10;
chicken = addChicken + leftChicken;
answer += addChicken;
}
return answer;
}
}
<작성한 코드>
처음에는 for문으로 시도했는데 for문을 무진장 반복해야 끝날 거 같다고 느꼈다. 그래서 빠르게 while문으로 변경했다. 조건은 치킨값이 10마리 이상이면 실행되도록 했다. addchicken에는 초기 서비스 치킨값을 넣어줬다. 그리고 leftChicken에는 10으로 나누고 남은 치킨의 마릿수를 저장했다. 그 뒤 chicken에 서비스 치킨 + 남은 마릿수를 해주고 answer에는 addChicken값만 반복해서 넣어줬다. 풀고 나니 간단해 보이지만 생각하는데 꽤 걸렸다.
'프로그래머스 문제풀이 > 알고리즘 (JAVA)' 카테고리의 다른 글
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (75~81번 문제풀이) (0) | 2023.09.29 |
---|---|
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (69~74번 문제풀이) (0) | 2023.09.28 |
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (56~62번 문제풀이) (0) | 2023.09.25 |
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (49~55번 문제풀이) (0) | 2023.09.22 |
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (41~48번 문제풀이) (0) | 2023.09.22 |
남건욱's 공부기록