문제

ALPS식 투표

처음에 이문제를 보았을 때 문제를 잘못이해 하고 코드를 작성하였다( 정말 최악인 안좋은 습관..)

이후 문제를 다시보니 어려운 문제가 아니였다. 포인트는 전대프연에 참가한 참가자들의 각각의 점수를

1~14까지 나누어서 이중 가장 큰 Index에 해당하는 인원의 Count 값을 올려주면 된다.

시간복잡도 부분을 생각하면 최악의 경우가 2500000*14이다 이로서 아래의 조건 1,2를 주의해서 코드를 작성하자!

(조건1. 전체득표율에 5%이상을 가져야지 후보에 오를 수 있다 아니면 탈락!)

(조건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
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import java.util.*;
 
public class Main{
    public static double max=-1.0;
    public static double [][] arr;
    public static double []memoryNumber;
    public static char [] memoryAlpha;
    public static int [] result;
    public static boolean flag=false;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int number=sc.nextInt();
        int totalNumber=sc.nextInt();
        arr= new double[totalNumber][14];
        memoryNumber=new double[totalNumber];
        memoryAlpha=new char[totalNumber];
        result=new int [totalNumber];
        for(int i=0;i<totalNumber;i++)
        {
            String str=sc.next();
            char al=str.charAt(0);
            double temp=sc.nextDouble();
            if(number*0.05>temp)
            {
                continue;
            }
            memoryAlpha[i]=al;
            memoryNumber[i]=temp;
        }
        for(int i=0;i<totalNumber;i++)
        {
            double temp=memoryNumber[i];
            for(int j=0;j<14;j++)
            {
                arr[i][j]=(temp/(double)(j+1));
            }
        }
        int count=0;
        int indexi=0;
        int indexj=0;
        while(true)
        {
            if(count>=14)
            {
                break;
            }
            for(int i=0;i<totalNumber;i++)
            {
                for(int j=0;j<14;j++)
                {
                    if(max<arr[i][j])
                    {
                        max=arr[i][j];
                        indexi=i;
                        indexj=j;
                    }
                }
            }
            result[indexi]++;
            arr[indexi][indexj]=-1.0;
            indexi=0;
            indexj=0;
            count++;
            max=-1.0;
        }
        for(int i=0;i<totalNumber;i++)
        {
            for(int j=0;j<totalNumber;j++)
            {
                if(memoryAlpha[i]<memoryAlpha[j])
                {
                    char temp=memoryAlpha[i];
                    memoryAlpha[i]=memoryAlpha[j];
                    memoryAlpha[j]=temp;
                    int tempNumber=result[i];
                    result[i]=result[j];
                    result[j]=tempNumber;
                    
                }
            }
        }
        for(int i=0;i<totalNumber;i++)
        {
            if(memoryAlpha[i]>='A' && memoryAlpha[i]<='Z')
            {
                System.out.println(memoryAlpha[i]+" "+result[i]);
            }
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

https://www.acmicpc.net/problem/2817

 

2817번: ALPS식 투표

문제 전대프연(전국 대학생 프로그래밍 대회 동아리 연합)에서는 매년 프로그래밍 대회를 연다. 올해도 무사히 대회를 개최한 전대프연 회장 성진은 수고해준 스태프들에게 수고비를 주기로 하였다. 하지만 몇몇 스태프는 일을 열심히하지 않았기 때문에 성진은 일을 열심히 한 사람에게만 주기로했다. 하지만 일을 무진장 열심히 한 사람과 덜 열심히 한 사람에게 수고비를 똑같이 주는 것은 불공평하다. 고민을 한 성진은 수고비를 받을 사람을 선출하는 방식으로 ALPS(Al

www.acmicpc.net

 

'알고리즘 > 문제' 카테고리의 다른 글

크로스워드 만들기  (0) 2019.06.30
컵홀더  (0) 2019.06.30
숫자 정사각형  (0) 2019.06.30
대회 or 인턴  (0) 2019.06.30
잃어버린 괄호  (0) 2019.06.30

문제

문제를 처음볼 때 이해가 쉽게 가는 문제이다.  정사각형을 이루는 모든 꼭지점의 수가 같으면 된다.

처음으로 생각 할 수 있는 것은 N과 M중 작은 숫자를 선택을 해야하는데 이 이상의 정사각형이 이루어 진다면 범위를 벗어나는 오류가 발생하기 때문이다. 요즘에 문제를 풀면서 가장 기본적인 것에서 자꾸 오류를 범하는 경우가 매우 많다. 이 문제를 풀면서도 6개의 상태가 같아야 하는데 5개를 넣는 등 작은 실수를 많이한다. 이를 방지하기 위해서 노트에 먼저 적는 습관을 만들기 위해 노력중이다.

 

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
import java.util.*;
 
public class Main{
    public static int result=0;
    public static int [][]arr;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int N=sc.nextInt();
        int M=sc.nextInt();
        arr=new int [N][M];
        for(int i=0;i<N;i++)
        {
            String temp=sc.next();
            for(int j=0;j<M;j++)
            {
                char al=temp.charAt(j);
                arr[i][j]=((int)al-48);
            }
        }
        int index=Math.min(N,M);
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<M;j++)
            {
                for(int k=0;k<index;k++)
                {
                    if(i+k<&& j+k<M) {
                        int temp1=arr[i][j];
                        int temp2=arr[i+k][j];
                        int temp3=arr[i][j+k];
                        int temp4=arr[i+k][j+k];
                        if(temp1==temp2&& temp1==temp3 && temp3==temp4 &&temp2==temp4 && temp1==temp4 && temp2==temp3)
                        {
                            result=Math.max(result, (k+1)*(k+1));
                        }
                    }
                }
            }
        }
        System.out.println(result);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-deco
 
 
ration:none">Colored by Color Scripter

 

https://www.acmicpc.net/problem/1051

 

1051번: 숫자 정사각형

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.

www.acmicpc.net

 

'알고리즘 > 문제' 카테고리의 다른 글

크로스워드 만들기  (0) 2019.06.30
컵홀더  (0) 2019.06.30
ALPS식 투표  (0) 2019.06.30
대회 or 인턴  (0) 2019.06.30
잃어버린 괄호  (0) 2019.06.30

문제

대회 or 인턴

비교적 쉬운 문제이다

팀을 이룰 수 있는 조건은 여학생 2명 남학생 1명 이렇게 주어지는데 여기에서 인턴인원 K명을 빼야한다.

만약 위에서 K가 2라고 하면 경우의 수는 3가지이다.

여자인턴 남자인턴 대회참여 여자학생 대회참여 남자학생
2 0 4 3
1 1 5 2
0 2 6 1

위의 표는 N=6 M=3 K=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
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
import java.util.*;
 
public class Main{
    public static int max=0;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int N=sc.nextInt();
        int M=sc.nextInt();
        int K=sc.nextInt();
        
        int temp1=0;
        int temp2=K;
        int garN=N;
        int garM=M;
        int result=0;
        
        while(true)
        {
            if(temp2<0)
            {
                break;
            }
            garN=garN-temp1;
            garM=garM-temp2;
            int count=0;
            while(true)
            {
                if((garN-=2)>=0 &&(garM-=1)>=0)
                {
                    count++;
                }
                else
                {
                    break;
                }
            }    
            if(max<count)
            {
                max=count;
            }
            count=1;
            garN=N;
            garM=M;
            temp1++;
            temp2--;
        }
        
        System.out.println(max);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

https://www.acmicpc.net/problem/2875

 

2875번: 대회 or 인턴

문제 백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.) 백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다. 그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다. 백준대학교에서는 뛰어난 인재들이 많기 때문

www.acmicpc.net

 

'알고리즘 > 문제' 카테고리의 다른 글

크로스워드 만들기  (0) 2019.06.30
컵홀더  (0) 2019.06.30
ALPS식 투표  (0) 2019.06.30
숫자 정사각형  (0) 2019.06.30
잃어버린 괄호  (0) 2019.06.30

문제

백준 1541번

처음에 문제를 보고 어렵게 생각하였는데 포인트를 잡는것이 중요했다.

포인트는 -연산 이후로 ()를 치면 값을 구할 수 있다.

55-50+40-45+50 --> 55-(50+40)-(45+50) 이렇게 계산할 수 있지만 식을 자세히 보면 -(50+40)-(45+50) 과 -(50+40+45+50)의 값이 같다는 것을 생각 할 수 있다. 그러므로 나는 첫번째 -연산자가 나오면 그 지점을 Index로 설정하고

Index전(Sum1), 후(Sum2)로 나누어 Sum1-Sum2를 연산하면 답을 구할 수 있다.

런타임 에러가 나왔다. 내가 생각한 코드에 예외적인 상황을 생각해보니 55 하나가 올수 도 있고 55+55이렇게 주어질 시 오류가 생기는 것을 확인할 수 있었다. 이부분을 해결하니 제출이 되었다.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.util.*;
 
public class Main{
    public static int [] number1;
    public static int [] number2;
    public static int [] number3;
    public static int sum1=0;
    public static int sum2=0;
    public static int sum3=0;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        String str = sc.next();
        String temp1="";
        String temp2="";
        int index=0;
        for(int i=0;i<str.length();i++)
        {
            if(str.charAt(i)=='-')
            {
                index=i;
                break;
            }
        }
        
        if(index==0) //55와 55+55예외 처리
        {
            String al[]=str.split("\\+");
            number3= new int[al.length];
            for(int i=0;i<al.length;i++)
            {
                number3[i]=Integer.parseInt(al[i]);
            }
            for(int i=0;i<number3.length;i++)
            {
                sum3+=number3[i];
            }
            System.out.println(sum3);
            return;
        }
        
        for(int i=0;i<index;i++)
        {
            temp1+=str.charAt(i);
        }
        String arr1[] = temp1.split("\\+|-");
        number1= new int [arr1.length];
        for(int i=0;i<number1.length;i++)
        {
            number1[i]=Integer.parseInt(arr1[i]);
        }
        
        
        for(int i=index+1;i<str.length();i++)
        {
            temp2+=str.charAt(i);
        }
        String arr2[] = temp2.split("\\+|-");
        number2= new int [arr2.length];
        for(int i=0;i<number2.length;i++)
        {
            number2[i]=Integer.parseInt(arr2[i]);
        }
        for(int i=0;i<number1.length;i++)
        {
            sum1+=number1[i];
        }
        for(int i=0;i<number2.length;i++)
        {
            sum2+=number2[i];
        }
        System.out.println(sum1-sum2);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.

www.acmicpc.net

 

'알고리즘 > 문제' 카테고리의 다른 글

크로스워드 만들기  (0) 2019.06.30
컵홀더  (0) 2019.06.30
ALPS식 투표  (0) 2019.06.30
숫자 정사각형  (0) 2019.06.30
대회 or 인턴  (0) 2019.06.30

Docker

Docker란?

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

여기에서 새롭게 등장하는 언어가 존재하는데 바로 '컨테이너'이다.

우리가 일반적으로 '컨테이너'라는 단어를 생각하면 화물을 수송할 때 규격화되어 배, 트레일러 등과 같은 다양한 운송수단으로 옮길 수 있는 대상이라고 생각할 수 있다.

서버에서 이야기하는 컨테이너도 비슷한 개념인데 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

가상화를 하는 방법으로는 기존에 있던 VM이 있는데 VM과 비교하여 Docker의 이점은 무엇인가?

VM과 Docker의 차이

가장 큰 장점으로는 사이즈가 작고 이를 토대로 속도가 VM보다 빠르다는 이점이 존재한다.

위의 그림을 보면 VM에서는 Hypervisor(호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼)가 Hardware를 가상화하고 그 위에 Guest OS가 올라가게 된다. 반면 Docker를 보면 Docker-engine위에 Application 실행에 필요한 바이너리만 올라간다. 그외의 커널 부분은 호스트의 커널을 공유한다. 이밖에도 배포부분을 생각하면 VM으로 배포를 한다고 하면 너무 무겁고 느려 운영환경에서 사용할 수 없다는 단점을 가지고  Docker는 이미지를 사용하여 사이즈가 작다는 장점을 가지면서 Docker가 현재 많이 사용된다.

 

Docker Command

Command Description
docker pull mysql mysql 설치
docker ps / docker ps -a 실행중인 컨테이너 출력 / 컨테이너 전체 출력
docker stop mysql 현재 실행중인 mysql을 중지
docker rm mysql / docker rmi mysql mysql제거 / mysql 이미지 제거
docker images 현재 이미지 확인
docker rmi -f mysql (강제) 컨테이너 삭제전 이미지 삭제하는 경우

 

Mysql설치

1. docker -d -p portNumber:portNumber -e MYSQL_ROOT_PASSWORD=password설정 --name 사용자 지정 이름 mysql

2. docker exec -i -t mysql bash (실행)

3. mysql -u root -p

4.설정한 비밀번호 입력 완료하면 데이터베이스 접근 완료

 

이미 받은 Mysql 이미지 삭제
설치 하는 전 과정

'SpringBoot' 카테고리의 다른 글

Spring으로 만드는 간단한 게시판(1)  (0) 2019.07.22
Get & Post  (0) 2019.07.08
해시(Hash) 와 암호화(Encryption)  (0) 2019.07.08
쿠키(Cookie)와 세션(Session)  (0) 2019.07.08
Spring 시작하기  (0) 2019.06.25

1. Library 와 Framework의 차이점

Library

라이브러리는 함수들의 집합이다. 프로그램을 만들 때 기존에 만들어진 함수들을 다시 재활용함으로 프로그램의 제작 기간과 프로그래머의 노력을 줄일 수 있다. Framework와 비교했을 때 각각의 함수들은 독립적으로 작동하기 때문에 필요한 함수만 호출하여 쓸 수 있다.

Framework

프레임워크 역시 함수들의 집합이지만 단순히 함수들을 모아 놓는 것이 아니라 특정한 프로그램 제작에 필요할 함수들을 모두 포함하고 있으며 프레임워크를 사용한다는 것은 프레임워크가 제시하는 방식으로 개발한다는 뜻을 의미한다. 결론적으로는 해당 틀(Frame)안에서 내 프로그램을 만드는 것이다.

프레임워크의 장점으로는 개발시간을 줄일 수 있고 또한 오류로부터 자유로울 수 있다.

 

2. 스프링 프레임워크 이해하기

웹 애플리케이션 개발을 위해 다양한 프레임워크가 존재하는데 이중에서 가장 많이 사용되고 있는 프레임워크중 하나는 스프링 MVC 프레임워크이다. 스프링 프레임 워크는 일반적인 사용자를 위한 웹 애플리케이션부터 기업 환경의 애플리케이션까지 다양한 범위에서 사용되는 프레임워크이다.

M(Model)V(View)C(Controller) 패턴

Model: 애플리케이션의 정보, 즉 데이터를 의미한다.

View: 사용자 인터페이스, 즉 사용자가 보고 사용하는 화면등을 의미

Controller: Model과 View의 중계 역활을 한다. 사용자의 요청을 파악하고 그에 맞는 결과를 사용자에게 돌려준다.

 

일반적으로 사용하는 스프링 MVC 구조

View: 사용자가 보는 화면 또는 결과를 의미한다.

Controller: 사용자가 웹브라우저를 통해서 어떠한 요청을 하면 그 요청을 처리할 컨트롤러를 호출하게 된다. 컨트롤러는 사용자의 요청을 처리하기 위한 비즈니스 로직을 호출하고 그 결과값을 사용자에게 전달해 주는 역할을 한다.

Service: 사용자의 요청을 처리하기 위한 비즈니스 로직이 수행된다. 일반적으로 서비스영역은 서비스 인터페이스와 인터페이스의 구현체로 나뉜다.

DAO: Data Access Object의 약자로 데이터베이스에 접속해서 비즈니스 로직 실행에 필요한 Query를 호출한다.

DB: DataBase

 

SpringBoot 시작하기 中 출판사: 인사이트

 

3.  REST API란?

Rest란 Representational State Transfer의 약자로 잘 표현된 HTTP URI로 리소스를 정의하고 HTTP 메서드로 리소스에 대한 행위를 정의한다. 리소스는 JSON, XML과 같은 여러 가지 언어로 표현될 수 있다.

 

REST API의 URI를 설계할 때 지켜야하는 일반적인 규칙

1. URI는 명사를 사용한다.

2. 슬래시(/)로 계층관계를 나타낸다.

3. URI의 마지막에는 슬래시를 사용하지 않는다.

4. URI는 소문자로만 작성가능하다.

5. 가독성을 높이기 위해 하이픈(-)은 사용할 수 있지만 밑줄(_)은 사용하지 않는다.

HTTP Method

HTTP Method Meaning Role
POST Create 리소스를 생성한다.
GET Read 해당 URI 리소스를 조회한다.
PUT Update 해당 URI의 리소스를 수정한다.
Delete Delete 해당 URI의 리소스를 삭제한다.

 

이번주에 다룬 Annotation

@Component

@Controller,@Service,@Repository는  @Component를 위의 3가지로 구체화 한 것이다.

@AutoWired

org.springframework.beans.factory.annotation.Autowired

Type에 따라 알아서 Bean을 주입한다.

필드, 생성자, 입력 파라미터가 여러 개인 메서드에 적용가능 

@Entity

실제 DB의 테이블과 매칭될 클래스임을 명시한다.

즉, 테이블과 링크될 클래스임을 나타냅니다.

@Id

해당 테이블의 PK 필드를 나타낸다.

@GeneratedValue

PK의 생성 규칙을 나타낸다.

@GenerateValue(strategy=GenerationType.AUTO);

@RestController

@Controller +@ResponseBody

@Controller와 @ResponseBody의 차이점

@Controller

API view 동시에 사용하는 경우에 사용

대신 API 서비스로 사용하는 경우는 @ResponseBody 사용하여 객체를 반환한다.

view(화면) return 주목적 

@RestController

view 필요없는 API 지원하는 서비스에서 사용 (Spring 4.0.1부터 제공)

@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.

 data(json, xml 등) return이 주목적

 

 

**Annotation 부분 출처

https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html

 

[Spring] Spring Annotation의 종류와 그 역할 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

'SpringBoot' 카테고리의 다른 글

Spring으로 만드는 간단한 게시판(1)  (0) 2019.07.22
Get & Post  (0) 2019.07.08
해시(Hash) 와 암호화(Encryption)  (0) 2019.07.08
쿠키(Cookie)와 세션(Session)  (0) 2019.07.08
Docker  (0) 2019.06.27

+ Recent posts