BOJ 1759번 암호만들기

|


import java.util.Arrays;
import java.util.Scanner;

public class BOJ_1759 {


    static String[] alpha;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] nm = sc.nextLine().split("\\s");
        int n = Integer.parseInt(nm[0]);
        int m = Integer.parseInt(nm[1]);

        alpha = sc.nextLine().split("\\s");
        Arrays.sort(alpha);

        solve(n, alpha, "", 0);


    }

    private static void solve(int n, String[] alpha, String password, int i) {
        if (n == password.length()) {
            if (check(password)) {
                System.out.println(password);
                return;
            }
        }

        if (i >= alpha.length)
            return;

        solve(n, alpha, password + alpha[i], i + 1);
        solve(n, alpha, password, i + 1);
    }

    private static boolean check(String password) {
        char[] chars = password.toCharArray();

        int mo = 0;
        int ja = 0;
        for (char alpha : chars) {
            if (alpha == 'a' || alpha == 'e' || alpha == 'i' || alpha == 'o' || alpha == 'u') {
                mo++;
            } else {
                ja++;
            }
        }
        return mo >= 1 && ja >= 2;
    }


}

BOJ 14501번 퇴사

|


import java.util.Scanner;

public class BOJ_14501 {

    static int[] time;
    static int[] price;
    static int answer = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        time = new int[n];
        price = new int[n];

        for (int i = 0; i < n; i++) {
            time[i] = sc.nextInt();
            price[i] = sc.nextInt();
        }

        solve(n, 0, 0, 0);
        System.out.println(answer);

    }

    private static void solve(int n, int t, int p, int i) {

        if (t == n) {
            if (p > answer)
                answer = p;
            return;
        }

        if (t > n)
            return;

        solve(n, t + time[i], p + price[i], i + time[i]);
        solve(n, t + 1, p, i + 1);

    }
}

차이를 최대로

|



import java.util.*;

public class BOJ_10819 {

    static int[] arr;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        Arrays.sort(arr);


        int max = 0;
        while (nextPermutation()) {
            int answer = 0;
            for (int i = 0; i < n - 1; i++) {
                answer += Math.abs(arr[i] - arr[i + 1]);
            }
            max = Math.max(answer, max);
        }
        System.out.println(max);

    }

    private static boolean nextPermutation() {

        int idx = arr.length - 1;

        while (true) {

            if (idx == 0) {
                return false;
            }

            if (arr[idx - 1] >= arr[idx]) {
                idx -= 1;
                continue;
            }

            int i = idx;
            int j = -1;
            for (int k = idx - 1; k < arr.length; k++) {
                if (arr[idx - 1] < arr[k])
                    j = k;
            }

            if (j != -1) {
                swap(i - 1, j);
                reverse(i);
                break;
            }
        }
        return true;
    }

    private static void reverse(int lh) {
        int temp = 0;
        int rh = arr.length - 1;
        while (lh < rh) {
            temp = arr[lh];
            arr[lh] = arr[rh];
            arr[rh] = temp;
            lh += 1;
            rh -= 1;
        }
    }

    private static void swap(int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

}

20190310_TIL

|

C언어

puts(), printf()

  • printf()와 달리 puts() 함수는 자동으로 개행(‘/n’) 처리하여 줌

fgets()

  • scanf()와 달리 개행문자(‘\n’)도 포함하여 ‘\0’로 변환한 뒤 버퍼에 저장한다.




TCP/IP 프로그래밍

####소켓과 파이프

  • 프로세스에 속하는 자원이 아니다. 운영체제의 자원이다.


####fork()

  • 부모 프로세스를 통째로 복사한다
  • 리턴 값을 통해 부모 프로세스인지, 자식프로세스 인지 확인할 수 있다 (0)

  • 멀티 프로세서 네트워크 프로그래밍 할 때 fork() 유의점
    • 서버 프로세스를 fork()하면서 자식 프로세스는 서버 소켓 + 클라이언트 소켓 모두 가지게 된다
    • 이 경우 하나의 소켓에 두 개의 파일 디스크립터가 존재하게 되고, 하나의 디스크립터에서 소켓을 소멸해도 소멸되지않고 남아있게 된다


좀비 프로세스

  • 부모 프로세스에서 fork()하여 생성된 자식 프로세스가 종료되는 상황은 다음과 같다
    • 인자를 전달하면 exit를 호출하는 경우
    • main 함수에서 return문을 실행하면서 값을 반환하는 경우
  • 종료되며 전달하는 값은 모두 운영체제로 전달되고 부모 프로세스에게 이 값이 전달될 때까지 자식 프로세스는 소멸되지 않는다 -> 부모프로세스가 책임지고 자식 프로세스가 전달하는 값을 처리해야 한다
    • wait() 함수(blocking)와 WIFEXITED, WEXITSTATUS 매크로 함수를 통해 자식 프로세스가 전달한 값을 처리한다
    • waitpid 함수(인자에 따라 nonBlocking)와 WIFEXITED, WEXITSTATUS 매크로 함수를 통해 자식 프로세스가 전달한 값을 처리한다


시그널 핸들링

  • waitpid() 함수를 사용하더라도 자식 프로세스가 종료됐는지 확인하려면 busy wait가 발생한다
  • 특정 상황이 발생하면 운영체제가 부모 프로세스에게 알려주는 것이 더 효율적이다.
    • 특정상황
      • SIGALRM - alarm 함수호출을 통해 등록된 시간이 된 상황
      • SIGINT - CTRL + C 가 입력된 상황
      • SIGHLD - 자식 프로세스가 종료된 상황
  • 어떻게 ?
    • signal (특정상황, 호출될 함수)
      • 유닉스 계열 운영체제 별로 약간의 차이가 있을 수 있다
    • sigaction(특정상황, 호출될 함수, 0)
      • signal에 비해 안정적이다 -> 유닉스 계열 운영체제에 모두 호환된다

모든 순열

|


import java.util.Scanner;
import java.util.Stack;

public class BOJ_10974 {

    static int[] arr;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = i + 1;
        }

        print();
        while (true) {
            if (nextPermutation())
                continue;
            else break;
        }
    }

    private static boolean nextPermutation() {

        int idx = arr.length - 1;

        while (true) {

            if (idx == 0) {
                return false;
            }

            if (arr[idx - 1] > arr[idx]) {
                idx -= 1;
                continue;
            }

            int i = idx;
            int j = -1;
            for (int k = idx - 1; k < arr.length; k++) {
                if (arr[idx - 1] < arr[k])
                    j = k;
            }

            if (j != -1) {
                swap(i - 1, j);
                reverse(i);
                print();
                break;
            }
        }

        return true;
    }

    private static void print() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if (i != arr.length - 1)
                sb.append(" ");
        }
        System.out.println(sb.toString());
    }

    private static void reverse(int idx) {
        Stack<Integer> stack = new Stack<>();
        for (int i = idx; i < arr.length; i++) {
            stack.add(arr[i]);
        }
        for (int i = idx; i < arr.length; i++) {
            arr[i] = stack.pop();
        }
    }

    private static void swap(int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}