13909번: 창문 닫기

서강대학교 컴퓨터공학과 실습실 R912호에는 현재 N개의 창문이 있고 또 N명의 사람이 있다. 1번째 사람은 1의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다.  2번째 사람은 2의 배수 번째

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.valueOf(br.readLine());
 
        int count = 0//창문이 열려있는 개수
        for(int i = 1; i * i <= N; i++) { //제곱수만 카운트
            count++;
        }
 
        br.close();
 
        bw.write(count + "\n");
 
        bw.flush();
        bw.close();
    }
 
}
 
 

🤔 해설

1. for(int i = 1; i * i <= N; i++) { ... }

    - 약수의 개수가 홀수인 경우는 제곱수

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.valueOf(br.readLine());
 
        br.close();
 
        bw.write(((int) Math.floor(Math.sqrt(N))) + "");
 
        bw.flush();
        bw.close();
    }
 
}
 
 

1. bw.write(((int) Math.floor(Math.sqrt(N))) + "");

    - 제곱수의 개수 = 제곱근의 내림값

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[JAVA] 백준 13909. 창문 닫기

※개인공부목적의정리글입니다.이글의내용이최선의해답은아닐수있습니다.문제서강대학교컴퓨터공학과실습실R912호에는현재N개의창문이있고또N명의사람이있다.1번째사람은1의배수번째창문

yuria.dev

 

 

프로그래머스

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

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
import java.util.Arrays;
import java.util.Comparator;
 
class Solution {
    public String[] solution(String[] strings, int n) {
        
        // 1. 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
        // 2. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순 정렬
        
        String[] answer = {};
        
        Arrays.sort(strings, new Comparator<String>() {
            
            public int compare(String s1, String s2) {
                int result = Integer.compare(s1.charAt(n), s2.charAt(n));
                if (result == 0) {
                    result = s1.compareTo(s2);
                }
                return result;
            };
            
        });
        
        return strings;
    }
}
 
 

🤔 해설

1. new Comparator<String>() { ... }

    - 정렬 기준 Overriding

2. int result = Integer.compare(s1.charAt(n), s2.charAt(n));

    - index위치에 따른 1차 비교

3. if (result == 0) { ... }

    - 사전순 2차 비교

 

😮  외의 풀이

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
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
 
class Solution {
        public String[] solution(String[] strings, int n) {
        
        // 1. 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
        // 2. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순 정렬
        
        String[] answer = {};
 
        List<String> list = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            list.add(strings[i].charAt(n) + strings[i]);
        }
        
        Collections.sort(list);
        answer = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i).substring(1, list.get(i).length());
        }
        
        return answer;
    }
}
 
 

1. list.add(strings[i].charAt(n) + strings[i]);

    - 1차 정렬대상을 문자열 앞에 추가

2. answer[i] = list.get(i).substring(1, list.get(i).length());

    - 결과값 return 전 추가한 문자열 제거

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
    public String[] solution(String[] strings, int n) {
      
    // 1. 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
    // 2. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순 정렬
      
    List<String> list = Arrays.asList(strings);
        
    list.sort((a, b) -> {
        int result = (a.split(""))[n].compareTo((b.split(""))[n]);
        
        if(result == 0)
            return a.compareTo(b);
        
        return result;
    });
        
    return list.toArray(new String[0]);
 
  }
}
 
 

1. List<String> list = Arrays.asList(strings);

    - List → Arrays

2. int result = (a.split(""))[n].compareTo((b.split(""))[n]);

    - 문자열을 문자 단위로 쪼개서 배열로 변환

3. return list.toArray(new String[0]);

    - Arrays → List

    - new String[0]: 매개변수로 배열의 타입을 지정

    - toArray: List의 크기에 따라 필요한 크기의 새 배열을 생성

 

 

 

🔗 소스 코드
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
21
class Solution {
    public long solution(int a, int b) {
        
        // a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수
        // a와 b가 같은 경우는 둘 중 아무 수나 리턴
        
        long answer = 0;
        
        if(a==b) return answer = a;
        
        int max = a > b ? a : b;
        int min = a > b ? b : a;
        
        while(max>=min){
            answer += max--;
        }
        
        return answer;
    }
}
 
 

🤔 해설

1. int max = a > b ? a : b;

    - a와 b의 대소관계가 정해져 있지 않으므로, max와 min 구별

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
    public long solution(int a, int b) {
        
        // a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수
        // a와 b가 같은 경우는 둘 중 아무 수나 리턴
        
        long answer = sumAtoB(Math.min(a, b), Math.max(b, a));;
        
        return answer;
    }
    
    private long sumAtoB(long a, long b) {
        return (b - a + 1* (a + b) / 2;
    }
}
 
 

1. return (b - a + 1) * (a + b) / 2;

    - 등차수열 합 공식

2. private long sumAtoB(int a, int b) { ... }

    - sumAtoB의 return 값이 int값을 벗어나므로 매개변수를 long으로 넘겨줘야 함

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

15650번: N과 M (2)

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

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
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 StringBuilder sb = new StringBuilder();
 
    public static int N, M;
 
    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());
 
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
 
        arr = new int[M];
        dfs(10);
 
        br.close();
 
        bw.write(sb.toString());
 
        bw.flush();
        bw.close();
 
    }
 
    public static void dfs(int idx, int depth) {
        if (depth == M) {
            for (int val : arr) {
                sb.append(val).append(' ');
            }
            sb.append('\n');
            return;
        }
 
        for (int i = idx; i <= N; i++) {
            arr[depth] = i;
            dfs(i + 1, depth + 1);
 
        }
    }
}
 
 

🤔 해설

1. for (int i = idx; i <= N; i++) { ... }

    - idx를 함께 이용해 오름차순으로 고른 수열 반환

2. dfs(i + 1, depth + 1);

    - 재귀호출 시, idx를 높여 재방문을 고려하지 않아도 됨

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[백준] 15650번 : N과 M (2) - JAVA [자바]

www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열

st-lab.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
31
32
33
34
import java.util.Arrays;
 
class Solution {
    public int[] solution(int[] arr, int divisor) {
        
        // 1. divisor로 나누어 떨어지는 값
        // 2. 오름차순
        // 3. 나누어 떨어지는 값이 없을 경우, 배열에 -1 담아 return
        
        int[] answer = {};
        
        int num = 0;
        for(int i : arr){
            if(i%divisor==0){
                num++;
            }
        }
        
        if(num==0){
            answer = new int[]{-1};
        } else {
            answer = new int[num];
            for(int i : arr){
                if(i%divisor==0){
                    answer[--num] = i;
                }
            }
            Arrays.sort(answer);
        }
        
        return answer;
    }
}
 
 

🤔 해설

1. if(num==0){ ... }

    - 나누어 떨어지는 수가 없을 경우, 조건문 처리

2. Arrays.sort(answer);

    - 입출력 예제에 맞춰 오름차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
 
class Solution {
    public int[] solution(int[] arr, int divisor) {
        
        int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
        if(answer.length == 0) answer = new int[] {-1};
        Arrays.sort(answer);
        
        return answer;
    }
}
 
 

1. filter(factor -> factor % divisor == 0)

    - stream.filter: 조건 처리

 

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
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
 
class Solution {
    public int[] solution(int[] arr, int divisor) {
        
        // 1. divisor로 나누어 떨어지는 값
        // 2. 오름차순
        // 3. 나누어 떨어지는 값이 없을 경우, 배열에 -1 담아 return
        
        int[] answer = {};
        
        List<Integer> list = new ArrayList<>();
        
        int num = 0;
        for(int i : arr){
            if(i%divisor==0){
                list.add(i);
            }
        }
        
        if(list.size()==0){
            answer = new int[]{-1};
        } else {
            answer = list.stream().mapToInt(i -> i).toArray();
            Arrays.sort(answer);        
        }
        
        return answer;
    }
}
 
 

1. mapToInt(i -> i);

    - 스트림의 각 요소를 정수로 매핑

2. toArray();

    - 기본적인 return type은 Object[]

    - 스트림의 요소 타입이 int로 결정되었기 때문에 toArray 메서드는 int[] 배열을 반환

        * 스트림의 요소 타입을 명시적으로 지정하면 해당 타입의 배열 return 가능

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr