알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

Think🤔

Solution✍
import java.util.Arrays;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {1};
        Arrays.sort(numbers); // numbers 배열들 오름차순으로 정렬 
        
        // 중복된 값 로직 안넣게 Set으로 변경 가능
        ArrayList<Integer> arr = new ArrayList(); // 제네릭 생략 가능 
        
        int sumNum = 0;
        for(int i=0; i<numbers.length; i++){
            for(int j=i+1; j<numbers.length; j++){
                sumNum = numbers[i]+numbers[j];
                // 중복값 비교 로직 필요
                System.out.println(sumNum);
            }
        }
        
        return answer;
    }
}
import java.util.Arrays;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] numbers) {
        
        // 중복된 값 로직 안넣게 Set으로 변경 가능
        ArrayList<Integer> arr = new ArrayList(); // 제네릭 생략 가능 
        
        int sumNum = 0;
        for(int i=0; i<numbers.length; i++){
            for(int j=i+1; j<numbers.length; j++){
                sumNum = numbers[i]+numbers[j];
                if(arr.indexOf(sumNum) == -1){
                    arr.add(sumNum);
                    continue;
                }
            }
        }
        
        int[] answer = new int[arr.size()];
        
        for(int i=0; i<arr.size(); i++){
            answer[i] = arr.get(i);
        }
        
        Arrays.sort(answer);
        
        return answer;
    }
}

Review🤩

HashSet을 이용하면 중복값을 안받을 수 있다.

ArrayList를 이용해서 내부에서 for문을 돌지않고, indexOf를 사용할 수 있음... 어느정도의 코스트가 들어가는지는 잘 모르겠다.


 

'Algorithm' 카테고리의 다른 글

[프로그래머스] K번째수  (0) 2022.08.02
[프로그래머스] 3진법 뒤집기  (0) 2022.07.29
[프로그래머스] 2016년  (0) 2022.07.27
[프로그래머스] 최소직사각형  (0) 2022.07.27
[프로그래머스] 소수 만들기  (0) 2022.07.26
알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

년도,월,일 계산 문제 

2016년은 윤년임 실제 있는 날

윤년 < 검색

 


Solution✍
class Solution {
    public String solution(int a, int b) {
        String answer = "";
        
        int[] selday = {31,29,31,30,31,30,31,31,30,31,30,31};
        String[] week = {"SUN","MON","TUE","WEN","THR","FRI","SAT"};
        
        int sumday = 4+b;
        for(int i=0; i<a-1; i++){
            sumday += selday[i];
        }
        
        answer = week[sumday%7];
        
        return answer;
    }
}

수요일, 목요일 영어 준말 틀려서 실패..

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        
        int[] selday = {31,29,31,30,31,30,31,31,30,31,30,31};
        String[] week = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
        
        int sumday = 4+b;
        for(int i=0; i<a-1; i++){
            sumday += selday[i];
        }
        
        answer = week[sumday%7];
        
        return answer;
    }
}

Review🤩

Calendar 객체이용해서 set 하려했지만 그런 문제가 아니였다!


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔
package egovframework.example.sample.service;

public class SampleVO2 extends SampleDefaultVO {
	public static void main(String[] args) {
		int[][] sizes = {{14, 4}, {19, 6}, {6, 16}, {18, 7}, {7,11}};
		int answer = 0;
		int num1 = sizes[0][0];
		int num2 = sizes[0][1];
		System.out.println(sizes.length);
		for(int i=0; i<sizes.length-1; i++){
			System.out.println("sizes[i][0] : " + sizes[i][0] + " i 값 : " + i);
			System.out.println("sizes[i][1] : " + sizes[i][1] + " i 값 : " + i);
			if(sizes[i][0] < sizes[i][1]){
				int tmp = 0;
				tmp = sizes[i][0];
				sizes[i][0] = sizes[0][i];
				sizes[0][i] = tmp;
			}
			if(sizes[i][0] > num1){
				num1 = sizes[i][0];
			}
		}
		
		answer = num1 * num2;
		System.out.println(answer);
	}
}

out of index가 계속해서 발생... 흠

 

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int num1 = 0;
        int num2 = 0;
        
        // 높이와 크기 중에 큰거를 뽑아서 더 하면됨.
        // 접근을 이상하게함...
        for(int i=0; i<sizes.length; i++){
            int tmpv = (sizes[i][0] >= sizes[i][1]) ? sizes[i][0] : sizes[i][1];
            int tmph = (sizes[i][0] <= sizes[i][1]) ? sizes[i][0] : sizes[i][1];
            num1 = Math.max(tmpv,num1);
            num2 = Math.max(tmph,num2);
        }
        
        answer = num1 * num2;
        
        return answer;
    }
}

Solution✍
class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int num1 = 0;
        int num2 = 0;
        
        // 높이와 크기 중에 큰거를 뽑아서 더 하면됨.
        // 접근을 이상하게함...
        for(int i=0; i<sizes.length; i++){
            int tmpv = (sizes[i][0] >= sizes[i][1]) ? sizes[i][0] : sizes[i][1];
            int tmph = (sizes[i][0] <= sizes[i][1]) ? sizes[i][0] : sizes[i][1];
            num1 = Math.max(tmpv,num1);
            num2 = Math.max(tmph,num2);
        }
        
        answer = num1 * num2;
        
        return answer;
    }
}

Review🤩

각 위치에 맞는 부분을 구해야하므로 반복문 안에서 각 지갑의 크기와 넓이가 필요


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/12977

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

소수를 구하는 방법

3개의 모든 경우의 수를 더하는 방법을 구하면 된다


Solution✍
import java.lang.Math;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        for(int i=0; i<nums.length; i++){
            for(int j=i+1; j<nums.length; j++){
                for(int k=j+1; k<nums.length; k++){
                    int sum = nums[i] + nums[j] + nums[k];
                    answer += isPrime(sum) ? 1 : 0;
                }
            }
        }
        
        return answer;
    }
    
    
    // 소수인지 판별
    private boolean isPrime(int num){
        for(int i=2; i<=Math.sqrt(num); i++){
            if(num % i == 0){
                return false;
            }
        }
        return true;
    }
}

반복문을 이용해서 세가지의 경우를 더하고, 소수인지 판별을 할 때는 제곱근 이하의 수까지만 검사를 하면

검사할 때 반복문의 시간을 줄일 수 있다.


Review🤩

java.util 패키지 java.lang 패키지의 차이점을 알자

 java.lang

클래스

용도


Object
모든 클래스는 Object가 최상위 클래스로 존재합니다. 배열을 포함한 모든 객체는 이 클래스의 메서드를 구현합니다.


System
표준 입력 장치(키보드)로부터 데이터를 입력 받거나 표준 출력 장치(모니터)로 출력할 때 사용합니다. JVM을 종료시킬 때 사용합니다. 쓰레기 수집기를 실행 요청할 때 사용합니다.


Class
클래스를 메모리로 로딩할 때 사용합니다.


String
문자열을 저장하고 여러 가지 정보를 얻을 때 사용합니다.


StringBuffer, StringBuilder
문자열을 저장하고 내부 문자열을 조작할 때 사용합니다.


Math
수학 함수를 이용할 때 사용합니다.


Wrapper
Byte, Short, Character, Integer, Float, Double, Bollean, Long
기본 타입의 데이터를 갖는 객체를 만들 때 사용합니다. 문자열을 기본 타입으로 변환할 때 사용합니다. 입력값을 검사할 때 사용합니다.

java.util

Arrays
배열을 조작(비교, 복사, 정렬, 찾기)할 때 사용합니다.


Calendar
운영체제의 날짜와 시간을 얻을 때 사용합니다.


Data
날짜와 시간 정보를 저장하는 클래스입니다.


Objects
객체 비교, null 여부 등을 조사할 때 사용합니다.


StringTokenizer
특정 문자로 구분된 문자열을 뽑아낼 때 사용합니다.


Random
난수를 얻을 때 사용합니다.

출처: https://koey.tistory.com/241 [기계공학과졸업하고게임만들기:티스토리]


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/42862

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

n -> 전체 학생의 수 2명 ~ 30명

            체육복 도난 1명 ~ n명 , 중복 번호 X

reserve -> 여벌의 체육복 1명 ~ n명 , 중복 번호 X

 

앞 뒤로만 체육복을 빌려줄 수 있고, 최대 많은 애들이 수업을 들을 수 있는 경우를 구하는 문제


Solution✍
import java.util.Arrays;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]){
                    answer++;
                    lost[i] = 0;
                    reserve[j] = 0;
                    break;
                }
            }
        }
        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]-1 || lost[i] == reserve[j]+1){
                    answer++;
                    reserve[j] = 0;
                    break;
                }
            }
        }
        
        return answer;
    }
}

앞 뒤로 빌려줄 수 있는 사람을 찾고 , ArrayList를 만들지 않고, 0으로 바꿔준다.

 

-> 0에서 -1로 수정

0으로 하면 +1할때, 1이 되면 그 값이 빌려줄 수 있는 값이 돼서, 2가 잃어버린 경우 한가지의 경우가 추가될 수 있음

-> 정렬을 하는 이유?

정렬을 하지 않았을 때 12,13이 실패했음... 흠?

정렬을 하지 않는 경우

4, 6, 8 이 잃어버린 경우 정렬이 되어있으면 3,5,7이 빌려줘서 입을 수 있지만

7, 5, 3 으로 빌려줄 수 있게 되면 큰 값 들이 먼저 빌려서 36을 못빌리므로 테스트 케이스에 통과할 수 없음

 

import java.util.Arrays;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]){
                    answer++;
                    lost[i] = -1;
                    reserve[j] = -1;
                    break;
                }
            }
        }
        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]-1 || lost[i] == reserve[j]+1){
                    answer++;
                    reserve[j] = -1;
                    break;
                }
            }
        }
        
        return answer;
    }
}

Review🤩

배열 지울 수 없으면 다른값을 대체하는 방법을 사용하자!


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/77484?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        
        int prize = 0;
        int bonus = 0;
        
        for(int i=0; i<6; i++){
            if(lottos[i] == 0){ // 0이면 알 수 없는 번호 bonus
                bonus++;
                continue;
            }else{
                for(int j=0; j<6; j++){
                    if(win_nums[i] == lottos[j]){
                        prize++;
                        break;
                    }
                }
            }
        }
        return new int[]{};
    }
}

prize 당첨 , bonus는 히든 카드? 0으로 들어오는건 +가 될 수 있고, 최저를 구할때는 0으로 두면 되기 때문

마지막 return 구문만 잘 해결하면 되는데..

 

switch문으로 6개 맞은 사람은 , 1등! 이런식으로 해서

두번 반복문을 돌리면 해결이 되지만!

쓸데없이 구문이 길어지는 것 같음.

 

한번에 return할 수 있는 방법을 찾는다.


Solution✍
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        
        int prize = 0;
        int bonus = 0;
        
        for(int i=0; i<6; i++){
            if(lottos[i] == 0){ // 0이면 알 수 없는 번호 bonus
                bonus++;
                continue;
            }else{
                for(int j=0; j<6; j++){
                    if(lottos[i] == win_nums[j]){
                        prize++;
                        break;
                    }
                }
            }
        }
        return new int[]{Math.min(7-(prize + bonus),6),Math.min(7 - prize, 6)};
    }
}

lottos[i] == win_nums[j] 의 위치가 바뀌어서 헤맷었다.

 

둘의 위치가 다르면 중간에 0,0인 부분에서 와일드카드로 넘어가버린 "1"을 검사 안해서 prize에 하나 값이 더해지지 않는다.


Review🤩

switch를 안써도 됨.


 

+ Recent posts