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: Oracle

 

1
2
3
4
5
  SELECT * 
    FROM CAR_RENTAL_COMPANY_CAR 
   WHERE OPTIONS LIKE '%네비게이션%' 
ORDER BY CAR_ID DESC;
 
 

🙂 확인 사항

1. CAR_RENTAL_COMPANY_CAR  테이블

2. 네비게이션 옵션 포함

3. 자동차 리스트 출력

4. 자동차 ID 기준 내림차순 정렬

 

😮  외의 풀이

1
2
3
4
5
SELECT * 
  FROM CAR_RENTAL_COMPANY_CAR
 WHERE REGEXP_LIKE(OPTIONS, '네비게이션')
ORDER BY CAR_ID DESC;
 
 
 

* REGEXP_LIKE(OPTIONS, '네비게이션')

    - OPTIONS 컬럼에서 정규 표현식을 사용하여 문자열에 '네비게이션'이 있는지 확인

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

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

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
11
12
  SELECT HISTORY_ID, 
         CAR_ID, 
         TO_CHAR(START_DATE, 'YYYY-MM-DD') START_DATE, 
         TO_CHAR(END_DATE, 'YYYY-MM-DD') END_DATE,
         CASE
             WHEN (END_DATE-START_DATE) >= 30 THEN '장기 대여'
             ELSE '단기 대여'
         END RENT_TYPE
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
   WHERE TO_CHAR(START_DATE, 'YYYY-MM'= '2022-09'
ORDER BY HISTORY_ID DESC;
 
 

🙂 확인 사항

1. CAR_RENTAL_COMPANY_RENTAL_HISTORY  테이블

2. 대여 시작일이 2022년 9월

3. 대여 기간이 30일 이상 - 장기 대여 / 30일 미만 - 단기 대여

4. 컬럼명은 RENT_TYPE

5. 전체 컬럼에 RENT_TYPE 추가

6. 대여 기록 ID 기준 내림차순 정렬

+ START_DATE, END_DATE 데이터 형태 및 컬럼명 유의

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
  SELECT HISTORY_ID, 
         CAR_ID, 
         TO_CHAR(START_DATE, 'YYYY-MM-DD') START_DATE, 
         TO_CHAR(END_DATE, 'YYYY-MM-DD') END_DATE,
         CASE
           WHEN EXTRACT(DAY FROM NUMTODSINTERVAL((END_DATE - START_DATE), 'DAY TO SECOND')) >= 30 THEN '장기 대여'
           ELSE '단기 대여'
         END RENT_TYPE
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
   WHERE TO_CHAR(START_DATE, 'YYYY-MM'= '2022-09'
ORDER BY HISTORY_ID DESC;
 
 

- NUMTODSINTERVAL(expr, 'DAY TO SECOND')

    - 숫자를 시간 간격 데이터 형식으로 변환

    - DAY TO SECOND: 일(DAY)부터 초(SECOND)까지의 시간 간격

- EXTRACT(DAY FROM ... )

    - 시간 간격 데이터에서 특정 요소를 추출하는 데 사용 - 여기서는 일(DAY)을 추출

 

 

 

🔗 소스 코드
GitHub

 

 

 

프로그래머스

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

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