반응형

작업했던 내용들을 조금씩 정리하려고 한다.

관리하는 사이트의 SSL인증서를 갱신하라는 메일을 받았다.

 

 

안내해준 사이트로 들어가서 로그인 후 갱신하면 된다.

 

1. 갱신하기 위해서는 우선 결제를 해야한다.

 

스타(*) 인증서로 1년에 무려 484,000 원

 

그래도 결제 진행해주고, 결제 몇시간 후에 인증서 파일을 메일로 보내주었다.

 

 

보통 cert, key 이렇게 두개 파일이 들어있고, 방화벽용 파일을 따로 보내주는 곳도 있었다.

그럼 이제 이 파일들로 무엇을 해야하는가

 

2. pem 파일 안의 코드들을 가동중인 웹서버 NGINX로 옮기기

nginx를 접속해주자. 보통 SSL파일은 최상위 폴더에서 

/etc/nginx/SSL 폴더 안에 존재한다.

 

 

기존 파일 백업을 잘해두자.(혹여나 그냥 바꿨는데 오류나면 낭패다.)

그리고 기존 파일명과 같게, 형식도 같게 해서 해당 폴더에 새 인증서 파일을 넣어준다.

 

3. NGINX의 conf.d(설정) 확인

vi 명령어를 통해 conf.d파일을 열어서 설정을 확인한다.

폴더의 위치나 파일명이 맞는지 확인하면 된다.

 

4. nginx 재기동

sudo nginx -t

명령어로 별 문제 없는지 테스트 한번 해주고

 

이런 결과 나오면 nginx를 재기동해주면 된다.

sudo service nginx restart

 

5. 호스팅업체를 이용중인 경우 SSL인증서 파일 전달 후 적용 요청

 

이렇게 한 후 SSL인증서가 잘 적용되었는지 확인하면 된다.

인증서 확인 방법은 다음과 같다.

 

브라우저에서 url왼쪽에 아이콘 클릭

 

뜨는 창에서 '이 연결은 안전합니다.' 클릭

 

뜨는 창에서 '인증서가 유효함' 클릭

 

 

그럼 이렇게 인증서 정보와 만료일이 나온다.

 

여기서 인증서 만료일이 옳게 바뀌었으면 잘 적용된 것이다!

반응형
반응형

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35


입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.


출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다.


예제 입력 예제 출력
60466175 36 ZZZZZ

풀이

10진법수 K를 N진법 수로 변환하는 방법은 K를 N으로 나눈 나머지를 역순서대로 배열하는 것이다.

 


코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] temp = line.split(" ");
        int n = Integer.parseInt(temp[0]);
        int m = Integer.parseInt(temp[1]);
        String[] array = {
                "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
                "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                "U", "V", "W", "X", "Y", "Z"
        };

        String answer = "";

        while(n/m>0){
            n=n/m;
            answer += array[n%m];
        }
        answer += array[n%m];

        System.out.println(answer);

    }
}
반응형
반응형

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.

전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.

A+ 4.5
A0 4.0
B+ 3.5
B0 3.0
C+ 2.5
C0 2.0
D+ 1.5
D0 1.0
F 0.0

P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

과연 치훈이는 무사히 졸업할 수 있을까?


 

입력

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.


출력

치훈이의 전공평점을 출력한다.

정답과의 절대오차 또는 상대오차가 10−4 이하이면 정답으로 인정한다.


제한

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 1.0,2.0,3.0,4.0중 하나이다.
  • 등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.
  • 적어도 한 과목은 등급이 P가 아님이 보장된다.

예제 입출력

입력 출력
ObjectOrientedProgramming1 3.0 A+
IntroductiontoComputerEngineering 3.0 A+
ObjectOrientedProgramming2 3.0 A0
CreativeComputerEngineeringDesign 3.0 A+
AssemblyLanguage 3.0 A+
InternetProgramming 3.0 B0
ApplicationProgramminginJava 3.0 A0
SystemProgramming 3.0 B0
OperatingSystem 3.0 B0
WirelessCommunicationsandNetworking 3.0 C+
LogicCircuits 3.0 B0
DataStructure 4.0 A+
MicroprocessorApplication 3.0 B+
EmbeddedSoftware 3.0 C0
ComputerSecurity 3.0 D+
Database 3.0 C+
Algorithm 3.0 B0
CapstoneDesigninCSE 3.0 B+
CompilerDesign 3.0 D0
ProblemSolving 4.0 P
3.284483
BruteForce 3.0 F
Greedy 1.0 F
DivideandConquer 2.0 F
DynamicProgramming 3.0 F
DepthFirstSearch 4.0 F
BreadthFirstSearch 3.0 F
ShortestPath 4.0 F
DisjointSet 2.0 F
MinimumSpanningTree 2.0 F
TopologicalSorting 1.0 F
LeastCommonAncestor 2.0 F
SegmentTree 4.0 F
EulerTourTechnique 3.0 F
StronglyConnectedComponent 2.0 F
BipartiteMatching 2.0 F
MaximumFlowProblem 3.0 F
SuffixArray 1.0 F
HeavyLightDecomposition 4.0 F
CentroidDecomposition 3.0 F
SplayTree 1.0 F
0.000000

풀이

-> 과목명은 필요없으므로, map에다가 등급과 학점값을 담아두고, Scanner를 통해서 입력받은 값의 두번째 값과 세번째 값을 가지고 총점과 총학점을 계산하였다. 오차는 어느정도 인정하기에 소수점 자릿수까지 6자리로 표현해서 출력하지는 않았다.


코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashMap<String, Double> map = new HashMap<>();
        map.put("A+",4.5);
        map.put("A0",4.0);
        map.put("B+",3.5);
        map.put("B0",3.0);
        map.put("C+",2.5);
        map.put("C0",2.0);
        map.put("D+",1.5);
        map.put("D0",1.0);
        map.put("F",0.0);

        int count = 1;
        double sum = 0;
        double gradeSum = 0; // 학점총점
        while(count<=20){
            String line = sc.nextLine().trim(); // 앞뒤 공백 제거
            String[] content = line.split(" ");
            double gradeDouble = Double.parseDouble(content[1]);
            String grade = content[2];
            if(!grade.equals("P")){
                double changedGrade = map.get(grade);
                sum += gradeDouble*changedGrade;
                gradeSum += gradeDouble;
            }
            count++;
        }
        double answer = sum/gradeSum;
        System.out.println(answer);

    }
}
반응형
반응형

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.


입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.


출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.


 예제 입출력

입력 출력
ljes=njak 6
ddz=z= 3
nljj 3
c=c= 2
dz=ak 3

풀이

-> replaceAll 메서드를 이용해서 주어진 문자열들을 입력문자열에 없는 'a'정도로 치환했다. 그 후 문자열의 길이를 구해서 리턴하려했다. 그런데 처음에는 원하는 결과가 나오지 않았다. word.replaceAll로 작성하고 word를 출력하니 입력받은 문자열이 그대로 나왔다. replaceAll 메서드는 원래의 변수자체를 수정해주는 것이 아니었다. 그래서 replaceAll한 값을 다시 word로 받아주었다.

코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        String[] croAlphabet = {"c=","c-","dz=","d-","lj","nj","s=","z="};

        for(int i=0;i<croAlphabet.length;i++){
            word = word.replaceAll(croAlphabet[i],"a");
        }

        int n = word.length();
        System.out.println(n);
    }
}
반응형
반응형

업무중에 날짜가 들어가는 데이터들이 생성될 때, 요일이 지정된 데이터들도 있지만 없을 경우에는 날짜데이터만으로 요일 데이터가 필요한 순간이 있었다. mysql에서는 날짜데이터로 요일을 조회할 수 있을까? 찾아보니 DATE_FORMAT을 통해서 가능했다. 코드는 아래와 같다.

 

코드

SELECT DATE_FORMAT('2024-03-20', '%W') AS weekday;
-- 출력 결과 : Wednesday

SELECT DATE_FORMAT('2024-03-20', '%a') AS weekday;
-- 출력 결과 : Wed

 

이를 이용해서 case문을 작성하면 한글로 요일데이터를 출력할 수 있다.

반응형
반응형

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ n ≤ 30

입출력 예

 

n result
4 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

 


입출력 예 설명

 

입출력 예 #1

  • 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
행\열 0 1 2 3
0 1 2 3 4
1 12 13 14 5
2 11 16 15 6
3 10 9 8 7

 

입출력 예 #2

  • 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.
행\열 0 1 2 3 4
0 1 2 3 4 5
1 16 17 18 19 6
2 15 24 25 20 7
3 14 23 22 21 8
4 13 12 11 10 9

 

따라서 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]를 return 합니다.


풀이

-> answer 배열을 n x n 사이즈로 초기화해준다. num 변수를 1로 생성한다. 행과 열의 시작과 끝 변수를 생성해준다. while문을 통해서 num이 n x n과 같아질 때까지 반복한다. "왼쪽에서 오른쪽으로 끝까지 간 후 위에서 아래로 끝까지 채우고, 다시 오른쪽에서 왼쪽으로 끝까지 채우고, 아래에서 위로 끝까지 채운다."를 반복한다. 이 때, for문이 종료될 때 마다, rowStart, rowEnd, colStart, colEnd를 적절하게 변화시켜줘야한다. 예를 들어 처음 오른쪽 끝까지 채운 후 아래로 가야할 때는 rowStart를 증가시켜 아래행부터 시작한다. 이렇게 반복문이 완료된 후 배열 answer를 return하면 결과이다.


코드

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int num = 1; // 배열에 넣을 숫자를 초기화

        int rowStart = 0, rowEnd = n - 1; // 행 시작과 끝 인덱스 초기화
        int colStart = 0, colEnd = n - 1; // 열 시작과 끝 인덱스 초기화

        while (num <= n * n) {
            // 왼쪽에서 오른쪽으로 숫자 채우기
            for (int i = colStart; i <= colEnd; i++) {
                answer[rowStart][i] = num++;
            }
            rowStart++; // 위쪽 행을 다 채웠으므로 행 시작 인덱스 증가

            // 위에서 아래로 숫자 채우기
            for (int i = rowStart; i <= rowEnd; i++) {
                answer[i][colEnd] = num++;
            }
            colEnd--; // 오른쪽 열을 다 채웠으므로 열 끝 인덱스 감소

            // 오른쪽에서 왼쪽으로 숫자 채우기
            for (int i = colEnd; i >= colStart; i--) {
                answer[rowEnd][i] = num++;
            }
            rowEnd--; // 아래쪽 행을 다 채웠으므로 행 끝 인덱스 감소

            // 아래에서 위로 숫자 채우기
            for (int i = rowEnd; i >= rowStart; i--) {
                answer[i][colStart] = num++;
            }
            colStart++; // 왼쪽 열을 다 채웠으므로 열 시작 인덱스 증가
        }

        return answer;
    }
}
반응형
반응형

문제 설명

문자열들이 담긴 리스트가 주어졌을 때, 모든 문자열들을 순서대로 합친 문자열을 꼬리 문자열이라고 합니다. 꼬리 문자열을 만들 때 특정 문자열을 포함한 문자열은 제외시키려고 합니다. 예를 들어 문자열 리스트 ["abc", "def", "ghi"]가 있고 문자열 "ef"를 포함한 문자열은 제외하고 꼬리 문자열을 만들면 "abcghi"가 됩니다.

문자열 리스트 str_list와 제외하려는 문자열 ex가 주어질 때, str_list에서 ex를 포함한 문자열을 제외하고 만든 꼬리 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ str_list의 길이 ≤ 10
  • 1 ≤ str_list의 원소의 길이 ≤ 10
  • 1 ≤ ex의 길이 ≤ 5

str_list ex result
["abc","def","ghi"] "ef" "abcdghi"
["abc","bbc","cbc"] "c" ""

 

입출력 예 설명

 

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 리스트 안의 모든 문자열이 "c"를 포함하므로 빈 문자열을 return합니다.

풀이

 

-> ArrayList를 선언한 후 반복문을 통해서 str_list에 ex값을 포함하고 있는지 contains 함수를 통해 확인한 후 포함하고 있으면 제외하고, 포함하고 있지 않으면 ArrayList에 담는다. 그 후, StringBuilder로 result를 선언하고, 반복문을 통해 ArrayList에 담았던 값들을 result에 append해서 return 해준다.

 


코드

 

import java.util.ArrayList;
import java.util.List;

class Solution {
    public String solution(String[] str_list, String ex) {
        List<String> filteredList = new ArrayList<>();

        for (String str : str_list) {
            if (!str.contains(ex)) {
                filteredList.add(str);
            }
        }

        StringBuilder result = new StringBuilder();
        for (String str : filteredList) {
            result.append(str);
        }

        return result.toString();
    }
}

 

반응형
반응형

문제 설명

0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.

각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.

 


제한사항

 

  • 3 ≤ rank의 길이 = attendance의 길이 ≤ 100
  • rank[i]는 i번 학생의 선발 고사 등수를 의미합니다.
  • rank의 원소는 1부터 n까지의 정수로 모두 서로 다릅니다.
  • attendance[i]는 i번 학생의 전국 대회 참석 가능 여부를 나타냅니다.
    • attendance[i]가 true라면 참석 가능, false면 참석 불가능을 의미합니다.
  • attendance의 원소 중 적어도 3개는 true입니다.

입출력 예

 

rank attendance result
[3,7,2,5,4,6,1] [false,true,true,true,true,false,false] 20403
[1,2,3] [true,true,true] 102
[6,1,5,2,3,4] [true,false,true,false,false,true] 50200

입출력 예 설명

 

입출력 예 #1

  • 예제 1번에서 1등은 6번 학생이지만 전국 대회에 참석 불가능하므로 넘어갑니다. 2등은 2번 학생이고 전국 대회에 참석 가능하므로 1순위로 선발됩니다. 3등은 0번 학생이고 전국 대회에 참석 불가능 하므로 넘어갑니다. 4등과 5등은 각각 4번, 3번 학생이고 두 학생 모두 전국 대회에 참석 가능하므로 각각 2순위, 3순위로 선발됩니다. 3명을 선발하였으므로 6등과 7등은 확인하지 않아도 됩니다. 따라서 10000 × 2 + 100 × 4 + 3 = 20403을 return 합니다.

입출력 예 #2

  • 예제 2번에서 1, 2, 3등은 각각 0번, 1번, 2번 학생이고 세 학생 모두 전국 대회에 참석 가능하므로 각각 1순위, 2순위, 3순위로 선발됩니다. 따라서 10000 × 0 + 100 × 1 + 2 = 102를 return 합니다.

입출력 예 #3

  • 예제 3번에서 1, 2, 3등은 각각 1번, 3번, 4번 학생이지만 세 학생 모두 전국 대회에 참석 불가능합니다. 다음으로 4, 5, 6등은 각각 5번, 2번, 0번 학생이고 세 학생 모두 전국 대회에 참석 가능하므로 각각 1순위, 2순위, 3순위로 선발됩니다. 따라서 10000 × 5 + 100 × 2 + 0 = 50200을 return 합니다.

풀이

 

1. ArrayList를 이용해서 temp배열에 true값을 가진 rank값들만 담는다.

2. temp2라는 정수배열을 선언해서 temp배열에 담은 값들을 옮긴 후에 오름차순으로 sort한다.

3. temp2의 index 0,1,2에 해당하는 값과 같은 값을 가지는 rank배열의 값의 index를 미리 선언해둔 a 배열에 담는다.

4. a배열의 3개 값으로 result값을 계산한다.


코드

 

import java.util.*;
class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        int answer = 0;
        int[] a={0,0,0};
        int b=0;
        int c=0;
        ArrayList<Integer> temp = new ArrayList<>();
        for(int i=0;i<rank.length;i++){
            if(attendance[i]==true){
                temp.add(rank[i]);
            }
        }
        int[] temp2 = new int[temp.size()];
        for(int i=0;i<temp.size();i++){
            temp2[i]=temp.get(i);
        }
        Arrays.sort(temp2);
        for(int i=0;i<rank.length;i++){
            for(int j=0;j<3;j++){
                if(temp2[j]==rank[i]){
                    a[j]=i;
                }
            }
        }
        answer = a[0]*10000+a[1]*100+a[2];
        return answer;
    }
}
반응형

+ Recent posts