프로그래머스

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

programmers.co.kr

 

Language: Java

 

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
class Solution {
    static int answer = 0;
 
    public int solution(int[] nums) {
        // 1. 3개의 수를 더했을 때 소수가 되는 경우의 개수
 
        for(int i=0; i<nums.length-2; i++) {
            for(int j=i+1; j<nums.length-1; j++) {
                for(int k=j+1; k<nums.length; k++) {
                    int sum = nums[i] + nums[j] + nums[k];
                    isPrime(sum);
                }
            }
        }
 
        return answer;
    }
 
    public static void isPrime(int i) {
        for(int j = 2; j<=(int) Math.sqrt(i); j++) {
            if(i%j==0return;
        }
        answer++;
    }
}
 
 

🤔 해설

1. for(int j = 2; j<=(int) Math.sqrt(i); j++) { ... }

   - 약수는 대칭 관계를 갖으므로 제곱근까지만 소수 확인

 

 

 

🔗 소스 코드
GitHub

 

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

Language: Java

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
 
public class Main {
 
    public static int[] arr;
    public static boolean[] visit;
    public static StringBuilder sb = new StringBuilder();
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        arr = new int[M];
        visit = new boolean[N];
        dfs(N, M, 0);
        
        br.close();
        
        bw.write(sb.toString());
        
        bw.flush();
        bw.close();
 
    }
 
    public static void dfs(int N, int M, int depth) {
        if (depth == M) {
            for (int val : arr) {
                sb.append(val).append(' ');
            }
            sb.append('\n');
            return;
        }
 
        for (int i = 0; i < N; i++) {
            if (!visit[i]) {
                visit[i] = true;
                arr[depth] = i + 1;
                dfs(N, M, depth + 1);
                visit[i] = false;
            }
        }
    }
}
 
 

🤔 해설

1. public static int[] arr;

    - leaf 노드 도착 시, 출력될 배

2. public static boolean[] visit;

    - 중복 제거를 위한 배열

3. arr = new int[M];

    - arr의 크기 = M

4. visit = new boolean[N];

    - 방문 여부 배열의 크기 = N

5. dfs(N, M, 0);

    - root 노드부터 방문 시작

6. if (depth == M) { ... }

    - leaf 노드 도착 시, 출력

7. if (!visit[i]) { ... }

    - 방문하지 않은 노드일 경우,

    - visit[i] = true;

        - 방문 여부를 true로 변경

    - arr[depth] = i + 1;

        - 현재 노드의 위치(=arr 배열에서의 위치)에 1번부터 순차적으로 기재

    - dfs(N, M, depth + 1);

        - 다음 노드의 위치로 이동하여 중복되지 않은 값의 경우, arr 배열에 값 입력

    - visit[i] = false;

        - leaf 노드 도착 시, dfs() 호출이 끝나고 i=0일 때의 1차 순환 마무리

        - i = N-1이 될 때까지 상기 과정 반복

 

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[알고리즘 PS] 백준 15649번 N과 M (1) 자바 문제풀이

문제 해당 포스팅은 백준의 N과 M (1) 의 접근과 해결 방법을 설명한 글 입니다. 정답 소스 코드를 확인하시려면 solve url 에서 확인 가능합니다. 이 문제를 해결하기 위해 어떤 방식으로 접근해야

wonit.tistory.com

 

 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

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
import java.util.ArrayList;
import java.util.List;
 
public class Solution {
    public int[] solution(int []arr) {
        
        // 1. 연속된 값에 대해서만 중복 제거: Set, Map X
        // 2. 순서 유지
        
        int[] answer = {};
        
        List<Integer> list = new ArrayList<>();
        list.add(arr[0]);
        
        for(int i = 1; i<arr.length; i++) {
            if(arr[i-1]!=arr[i])
                list.add(arr[i]);
        }
        
        answer = new int[list.size()];
        
        int j = 0;
        for(int i : list){
            answer[j++= i;
        }
        
        return answer;
    }
}
 
 

🤔 해설

1. if(arr[i-1]!=arr[i]) list.add(arr[i]);

   - 이전 원소와 현재 원소가 같지 않을 경우에만 list에 추가

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.ArrayList;
import java.util.List;
 
public class Solution {
    public int[] solution(int []arr) {
        List<Integer> list = new ArrayList<Integer>();
        int preNum = -1;
        for(int num : arr) {
            if(preNum != num)
                list.add(num);
            preNum = num;
        }       
        
        int[] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++) {
            answer[i] = list.get(i).intValue();
        }
        
        return answer;
    }
}
 
 

1. if(preNum != num)

    - preNum을 선언하여 이전 숫자와 비교

2. intValue()

    - Integer → int 변환

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.LinkedList;
 
public class Solution {
    public int[] solution(int []arr) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(arr[0]);
        
        for(int i=1; i<arr.length; i++){
            if(arr[i]!=list.getLast()){
                list.add(arr[i]);
            }
        }
        
        Integer[] listing = list.toArray(new Integer[list.size()]);
        
        int[] answer = Arrays.stream(listing).mapToInt(Integer::intValue).toArray();
        
        return answer;
    }
}
 
 

1. getLast();

     - LinkedList 함수: 마지막 값 출력, 이전 원소값

2. mapToInt(Integer::intValue)

    - mapToInt(): 스트림의 각 요소를 변환하고, 새로운 스트림을 반환

    - Integer::intValue: 메서드 레퍼런스(Method Reference), Integer 클래스의 intValue() 메서드

        - Integer 객체를 정수형(int) 값으로 변환

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
    public String solution(String s) {
        
        // 단어 s의 가운데 글자를 반환
        // 짝수라면 가운데 두글자를 반환
        
        String answer = "";
        
        int len = s.length()/2;
        
        if(s.length()%2 == 0){
            answer = s.charAt(len-1+ "" + s.charAt(len);
        } else {
            answer = s.charAt(len) + "";
        }
        
        return answer;
    }
}
 
 

🤔 해설

1. answer = s.charAt(len-1) + "" + s.charAt(len);

   - 짝수일 경우, len-1 ~ len 글자 반환

2. answer = s.charAt(len) + "";

    - 홀수일 경우, len 글자 반환

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
class Solution {
    public String solution(String s) {
        String answer = "";
                
        answer = s.substring((s.length() - 1/ 2, s.length() / 2 + 1);
        
        return answer;
    }
}
 
 

1.  answer = s.substring((s.length() - 1) / 2, s.length() / 2 + 1);

    - substring()을 활용하여 중간 문자열 추출

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Set;
import java.util.HashSet;
 
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        Set<Integer> set = new HashSet<>();
        for(int i : nums){
            set.add(i);
        }
        
        answer = set.size() <= nums.length/2 ? set.size() : nums.length/2;
        
        return answer;
    }
}
 
 

🤔 해설

1. Set<Integer> set = new HashSet<>();

   - set에 입력하여, 중복값 제거

2. answer = set.size() <= nums.length/2 ? set.size() : nums.length/2;

    - set 크기와 nums의 크기의 1/2을 비교하여 작은 값 return

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;
import java.util.stream.Collectors;
 
class Solution {
    public int solution(int[] nums) {
        return Arrays.stream(nums)
                .boxed()
                .collect(Collectors.collectingAndThen(Collectors.toSet(),
                        phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
    }
}
 
 

1. Arrays.stream(nums)

    - nums 배열을 stream으로 변환

2. boxed()

    - 스트림의 요소를 박싱(boxing)하여 Integer 객체로 변환

3. collect()

    - 스트림의 요소를 수집하고 다양한 중간 및 종료 연산을 수행

    - Collectors.toSet()

        - 스트림의 요소를 중복 없이 유일한 값만 포함하는 Set 컬렉션으로 수집

    - phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)

       - phonekemons: 중복을 제거한 Set 컬렉션 이름(Collectors.toSet()에서 생성된 Set 컬렉션에 대한 임시 변수의 이름)

 

⭐ 스트림: '데이터의 흐름’

- 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있음

- 람다를 이용해서 코드의 양을 줄이고 간결하게 표현할 수 있음

- 배열과 컬렉션을 함수형으로 처리할 수 있음

간단하게 병렬처리(multi-threading)가 가능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
 
class Solution {
    public int solution(int[] nums) {
        //1. 기존 length를 구한다.
        //2. 중복값을 제거한 length를 구한다.
        //3. 두 값중 최소값이 정답.
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0 ; i < nums.length; i++){
            if(!list.contains(nums[i])){
                list.add(nums[i]);
            }
        }
 
        return nums.length/2 > list.size()?list.size():nums.length/2;
    }
}
 
 

⭐ 풀 때, 로직 적어두고 풀기

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

Java 스트림 Stream (1) 총정리

이번 포스트에서는 Java 8의 스트림(Stream)을 살펴봅니다. 총 두 개의 포스트로, 기본적인 내용을 총정리하는 이번 포스트와 좀 더 고급 내용을 다루는 다음 포스트로 나뉘어져 있습니다. Java 스트

futurecreator.github.io

 

프로그래머스

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

programmers.co.kr