문제

문제 2857

처음에 이 문제를 보았을때 하나의 String.length()까지 돌때 첫번째 'F'가 발견되면 그 뒤에 'B' 'I'가 차례대로 발견되면 해당되는 인덱스를 배열에 저장하여 출력하는 형식으로 생각하였다. 예외사항이 하나가 존재하는데 String.length()가 3미만이라면 그 부분은 continue를 통해 통과해준다. (단순한 String 다루는 문제)

 

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.util.*;
 
public class Main{
    public static String [] arr;
    public static int [] remember;
    public static int count=0;
    public static int indexCount=0;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        arr= new String[5];
        remember=new int[5];
        for(int i=0;i<5;i++)
        {
            String temp=sc.next();
            arr[i]=temp;
        }
    
        int qq=0;
        for(int i=0;i<5;i++)
        {
            if(arr[i].length()<3)//길이가 3이하는 스킵 
            {
                continue;
            }
            for(int j=0;j<arr[i].length();j++)
            {
                if(arr[i].charAt(j)=='F'&&arr[i].charAt(j+1)=='B'&&arr[i].charAt(j+2)=='I'//FBI
                {
                    remember[indexCount]=i+1;
                    indexCount++;
                    count++;
                    break;
                }                
            }
        }
        if(count==0)
        {
            System.out.println("HE GOT AWAY!");
        }
        int al=0;
        for(int i=0;i<5;i++)
        {
            if(remember[i]!=0 && al==indexCount-1)
            {
                System.out.println(remember[i]);
            }
            else if(remember[i]!=0 && al!=indexCount-1)
            {
                System.out.print(remember[i]+" ");
                al++;
            }
        }
    
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

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

 

2857번: FBI

문제 5명의 요원 중 FBI 요원을 찾는 프로그램을 작성하시오. FBI요원은 요원의 첩보원명에 FBI가 들어있다.  입력 5개 줄에 요원의 첩보원명이 주어진다. 첩보원명은 알파벳 대문자, 숫자 0~9, 대시 (-)로만 이루어져 있으며, 최대 10글자이다. 출력 첫째 줄에 FBI 요원을 출력한다. 이때, 해당하는 요원이 몇 번째 입력인지를 공백으로 구분하여 출력해야 하며, 오름차순으로 출력해야 한다. 만약 FBI 요원이 없다면 "HE GOT AWAY!"를

www.acmicpc.net

 

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

파티가 끝나고 난 뒤  (0) 2019.07.08
슈퍼마리오문제  (0) 2019.07.08
블라인드  (0) 2019.06.30
블랙잭  (0) 2019.06.30
크로스워드 만들기  (0) 2019.06.30

Spring을 공부하면서 @GetMapping, @PostMapping을 보았다. 대학교 시절 네트워크수업에서 Get, Post 방식을 배웠지면 누군가 물어봤을때 딱 자신있게 대답을 할 수 없어 두 방식이 어떠한 방법이고 차이점이 무엇인지 정리하기 위해 게시글을 작성하였다.

 

클라이언트가 서버로 요청을 보내는 방법은  1. Get  2.Post 이렇게 두가지 방법이 있다.

 

Get 방식

Get방식은 어떠한 정보를 가져와서 조회하기 위해 사용되는 방식이다. Get 방식에는 여러가지의 특징이 있다.

1. URL에 변수를 포함시켜 요청한다.

2. 데이터를 header를 포함하여 전송한다.

3. URL에 데이터가 노출되어 보안에 취약하다.

4. 캐싱이 가능하다. (캐싱: 한번 접근후, 똑같은 요청을 할 시 빠르게 접근하기 위해 레지스터에 데이터를 저장시키는것)

 

처음에 Spring을 공부하였을때 Get방식 즉, @GetMapping을 사용하여 loginRequest, joinRequest를 사용하였더니 URL에 아이디, 비밀번호 혹은 아이디, 비밀번호, 이름이 노출되는것을 확인하였다. 이것에 대한 해결방안으로 Get방식(@GetMapping)이 아닌 Post(@PostMapping)방법을 사용하였다.

 

Post 방식 

Post방식은 데이터를 서버로 제출하여 추가 또는 수정하기 위해서 데이터를 전송하는 방식이다 Post방식 또한 여러 특징이 있다.

1. URL에 변수에 변수를 노출하지 않고 요청을 한다.

2. 데이터를 Body에 포함시킨다.

3. URL에 데이터가 노툴되지 않아서 기본 보안이 설정되어 있다.

4. 전송하는데 길이 제한이 없다.

5. 캐싱을 불가능하다.

 

아래의 사진은 Controller에서 로그인시 , 회원가입시 보내는 @PostMapping 방식의 코드다.

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
 
import org.springframework.stereotype.Controller;
 
 
@Controller
public class UsersController {
 
    private final ListService listService;
//    private final UsersRepository userRepository;//final 재할당 안되게
    private final JoinService joinService;
    private final LonginService longinService;
 
    public UsersController(JoinService joinService,ListService listService, LonginService longinService) {
        this.joinService = joinService;
        this.listService = listService;
        this.longinService=longinService;
    }
    @PostMapping(value = "/joinRequest")
    public String joinRequest(HttpServletRequest request){
       joinService.joinUser(request);
       return "join";
   }
 
   @PostMapping(value="/loginRequest")
   public String loginRequest(HttpServletRequest request){
        return "index";
   }
 
   @GetMapping(value="/find")
    public String find(){
        System.out.println(listService.find());
        return "index";
   }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'SpringBoot' 카테고리의 다른 글

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

Spring을 통해 로그인 및 회원가입 시스템을 만들때 비밀번호에 대해서 해시(Hash)가 필요하다는 생각을 하였지만 해시(Hash)와 암호화(Encryption) 의 차이점을 정확히 설명할 수 없었다. 이번기회에 정리하는것이 차후에 진행될 프로젝트에도 많은 도움이 될것같아 작성하게 되었다.

 

차이점

Hash는 평문으로 암호화된 문장으로 만들어 주는 기능이다.

Encryption은 평문으로 암호화 된 문장으로 만들어 주는 기능(즉 Hash의 기능) + 암호화 된 문장을 다시 평문으로 만들어 주는 복호화 기능도 가능다.

즉, Hash는 단방향 암호화 기법이고 Encryption은 양뱡향 암호화 기법이다.

 

해시에서 알아야할 중요한 것들 

1. 해시 알고리즘 및 암호화 알고리즘은 다양항 종류가 존재, 알고리즘은 모두에게 공대 되어있다

2. 해시 알고리즘마다 hash길이가 다르고 보안이 뚫린 해시 함수도 존재

3. 해시 알고리즘은 특정 입력에 대해 항상 같은 해시값을 리턴한다

4. 해시된 값은 입력이 다른 값이지만 같을 수 있다.

 

로그인 및 회원가입 시스템에서 나는 Hash SHA 26을 사용하였다. 아래의 코드는 SHA 265에 관한 코드이다.

진행하는 프로젝트에서 설정한 비밀번호가 제대로 Hash되었는지 알아보자.

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 org.springframework.stereotype.Service;
 
import java.security.MessageDigest;
@Service
public class UserPasswordHash {
    public String getSHA256(String plainText) {
        String shaString = "";
        if(plainText == null){
            return "";
        }
        try {
            MessageDigest sh = MessageDigest.getInstance("SHA-256");
            sh.update(plainText.getBytes());
            byte byteData[] = sh.digest();
            StringBuffer stringBuffer = new StringBuffer();
            int byteSize = byteData.length;
 
            for (int i = 0; i < byteSize; i++) {
                stringBuffer.append(Integer.toString((byteData[i] & 0xff+ 0x100 , 16).substring(1));
            }
            shaString = stringBuffer.toString();
        }
 
        catch (Exception e) {
            e.printStackTrace();
            shaString = null;
        }
        return shaString;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

회원가입페이지

위의 그림은 회원가입 페이지이다. 아이디는 :al, 비밀번호는 123으로 설정하였다. 콘솔창에서 hash된 값을 보았다.

회원가입 Service 부분

위의 그림에서 console창에서 비밀번호 123이 SHA 256 알고리즘을 통해 해시된값을 볼수 있다. 이제 저 값이 제대로 해시 되었는지 비교해볼 필요가 있다. http://www.convertstring.com/ko/Hash/SHA256 이곳은 SHA 256알고리즘을 통해 해시된값을 볼 수 있는 사이트이다.

사이트에서 SHA256을 사용하여 변경된 결과값 

위의 콘솔창에서 출력되는 결과값이 작아 보이지 않을수도 있지만 비교하였을때 같은 값이 나오는것을 알수있다. 이를 통해 해시가 제대로 작동하고 있다는 것을 알 수 있다. 로그인 부분또한 이와 마찬가지로 사용자가 입력한 id& password 값을 받아 password는 해시를 통해 데이터베이스에 접근하여 맞는지 비교하고 맞는것이 존재하면 회원로그인 상태로 넘어가면된다.

'SpringBoot' 카테고리의 다른 글

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

로그인 기능까지 구현 완료 후 로그인 한 사용자의 정보를 어떠한 방법으로 다룰지에 대해 공부하다 Session이 필요하다는것을 알게 되었다.

Session은 대학교에서 Cookie와 같이 다룬것이 기억이 나는데 이것의 정확한 의미, 프로세스, 차이점을 정확하게 모르고있었다. 

이번기회에 이러한것들을 한번 정리하는것이 좋다고 생각하여 이렇게 게시글을 작성하게 되었다.

 

Cookie와 Session을 왜 사용하는가?

이 질문의 답은 간단하게 설명할 수 있다. HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용된다.

HTTP 프로토콜의 특징

1. 비연결지향(Connectionless)  

HTTP는 먼저 클라이언트가 request를 서버에 보내면 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는 특성

2. 상태정보유지안함(Stateless)

연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태정보는 유지하지 않는 특성

 

쿠키(Cookie)

쿠키는 클라이언트 로컬에 저장되는 키와 값이 들어오는 작은 데이터 파일을 의미한다.

쿠키의 구성요소로는 이름, 값, 말료날짜, 경로정보가 포함되어있다. 또한 쿠키는 일정시간동안 데이터를 저장할 수 있다.

 

프로세스 

1. 브루우저에서 웹페이지 접속

2. 클라이언트가 요청한 웹 페이지를 받으면서 쿠키를 클라이언트 로컬에 저장

3. 클라이언트가 재 요청시 웹페이지 요청과 함께 쿠키값도 같이 전송

이러한 프로세스의 결과적으로 우리가 웹을 사용할 때 지속적으로 로그인정보를  가지고 있는것처럼 사용하고 있다.

 

 

세션(Session)

일정시간동안 같은 브라우저로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술이다. 

클라이언트가 request를 보내면 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는데 이것이 Session ID이다. 

 

프로세스

1. 클라이언트가 서버에 접속시 세션 ID를 발급

2. 서버에서는 클라이언트로 발급해준 세션 ID를 쿠키를 사용해 저장 (이때 쿠키를 JSESSIONID이라고 말함)

3. 클라이언트는 다시 접속할 때 이 쿠키를 이용해 서버에 전달

 

 

Cookie와 Session의 차이점

  Cookie(쿠키) Session(세션)
저장위치 클라이언트에 파일로 저장 서버에 저장
라이프 사이클  만료시간 존재 하지만 브라우저 종료시 정보가 계속 남아있을 수 있다.  브라우저 종료시 만료시간에 상관없이 무조건 소멸된다.
속도 속도가 빠르다 속도가 비교적 느리다
보안 request에서 스나이핑 가능 보안성 비교적 좋음

 

'SpringBoot' 카테고리의 다른 글

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

문제

위 문제를 보면 별의 상태가 5개이다. 각 시작 Spot으로 부터 4*4포문을 돌면서 별을 카운트 하여 이 수/4를 하면 해당 상태의 Index에 도달할 수 있다. 만약 가로 범위를 넘어간다면 가로는 1로 세로의 Spot을 기존의 Spot+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
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.util.*;
 
public class Main{
    public static char [][] arr;
    public static int [] result;
    public static int starCount=0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int M=sc.nextInt();
        int N=sc.nextInt();
        int calM=5*M+1;
        int calN=5*N+1
        arr = new char[calM][calN];
        result=new int [5];
        for(int i=0;i<calM;i++)
        {
            String str=sc.next();
            for(int j=0;j<calN;j++)
            {
                arr[i][j]=str.charAt(j);
            }
        }
        int startX=1;
        int startY=1;
        while(true)
        {
            if(startX>=calM)
            {
                break;
            }
            
            for(int i=startX;i<startX+4;i++)
            {
                for(int j=startY;j<startY+4;j++)
                {
                    if(arr[i][j]=='*')
                    {
                        starCount++;
                    }
                }
            }
            result[starCount/4]++;
            starCount=0;
            startY=startY+5;
            if(startY>=calN)
            {
                startY=1;
                startX=startX+5;
            }
        }
        for(int i=0;i<5;i++)
        {
            System.out.print(result[i]+" ");
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

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

 

2799번: 블라인드

문제 봄이 오고 있다. 해는 높이 떠서 환하게 빛나고 있다. 사람들은 햇볕을 가리기 위해 블라인드를 내린다. 상근이는 이웃들이 무엇을 하는지를 염탐하고, 이것에 대해서 뒷담화를 하는 주부이다. 올해는 건너편 아파트에 사는 사람들이 블라인드를 얼마나 내리는지를 조사하려고 한다.  모든 창문은 4*4 그리드로 나타낼 수 있고, *를 이용해서 블라인드를 나타낸다. 상근이가 볼 수 있는 창문은 다음 5가지 상태 중 하나이다. 건너편 아파트의 한 층에는 N개의 창

www.acmicpc.net

 

 

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

슈퍼마리오문제  (0) 2019.07.08
FBI  (0) 2019.07.08
블랙잭  (0) 2019.06.30
크로스워드 만들기  (0) 2019.06.30
컵홀더  (0) 2019.06.30

문제

이 문제는 그렇게 어려운 문제가 아니라고 느꼈다.

문제의 설명을 하면 카드의 합이 21이 넘지 않는 한도 내에서 카드의 합을 가장 크게 만드는 게임이 바로 블랙잭이다.

딜러가 M의 숫자를 외치고 3장을 골라 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야한다.

(세가지의 숫자를 더한 값 <=M && 이전의 비교값 < 세가지 숫자를 더한 값) 만족하면 이전의 비교값을 지금으로 변경해준다.)

삼중포문을 사용하는데 시간복잡도 부분에서는 문제가 되지 않는다. (최악 100*100*100 --> 1초안에 들어감)

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
import java.util.*;
 
public class Main{
    public static int [] arr;
    public static int result=0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        arr = new int [101];
        int n=sc.nextInt();
        int m=sc.nextInt();
        for(int i=0;i<n;i++)
        {
            arr[i]=sc.nextInt();
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                for(int k=0;k<n;k++)
                {
                    if(i!=&&j!=&& i!=k)
                    {
                        int temp=arr[i]+arr[j]+arr[k];
                        if(temp<=&& result<temp)
                        {
                            result=temp;
                        }
                    }
                }
            }
        }
        System.out.println(result);
    }
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

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

 

2798번: 블랙잭

문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버젼의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게

www.acmicpc.net

 

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

FBI  (0) 2019.07.08
블라인드  (0) 2019.06.30
크로스워드 만들기  (0) 2019.06.30
컵홀더  (0) 2019.06.30
ALPS식 투표  (0) 2019.06.30

문제

이 문제는 딱히 설명할 것이 많지 않은 문제이다.

두문장 중 첫번째로 같은 문자의 2개의 문자 Index를 받으면 해결된다.

시간복잡도 부분을 살펴보면 최대 30글자이기 때문에 문제가 되지 않는다.

 

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
import java.util.*;
 
public class Main{
    public static char [][]arr;
    public static int x;
    public static int y;
    public static boolean al=false;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1=sc.next();
        String str2=sc.next();
        
        int number1=str1.length();
        int number2=str2.length();
        
        arr=new char[number2][number1];
        
        Init(number2,number1);
        
        for(int i=0;i<number1;i++)
        {
            if(al==true)
            {
                break;
            }
            char temp2=str1.charAt(i);
            for(int j=0;j<number2;j++)
            {
                char temp1=str2.charAt(j);
                if(temp2==temp1)
                {
                    x=i;
                    y=j;
                    al=true;
                    break;
                }
            }
        }
        for(int i=0;i<number1;i++)
        {
            arr[y][i]=str1.charAt(i);
        }
        for(int i=0;i<number2;i++)
        {
            arr[i][x]=str2.charAt(i);
        }
        print(number2,number1);
        
    }
    private static void print(int number2, int number1) {
        for(int i=0;i<number2;i++)
        {
            for(int j=0;j<number1;j++)
            {
                System.out.print(arr[i][j]);
            }
            System.out.println();
        }
        
    }
    private static void Init(int number2, int number1) {
        for(int i=0;i<number2;i++)
        {
            for(int j=0;j<number1;j++)
            {
                arr[i][j]='.';
            }
        }
        
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

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

 

2804번: 크로스워드 만들기

문제 창영이는 크로스워드 퍼즐을 만들려고 한다. 두 단어 A와 B가 주어진다. A는 가로로 놓여야 하고, B는 세로로 놓어야 한다. 또, 두 단어는 서로 교차해야 한다. (정확히 한 글자를 공유해야 한다) 공유하는 글자는 A와 B에 동시에 포함되어 있는 글자여야 하고, 그런 글자가 여럿인 경우 A에서 제일 먼저 등장하는 글자를 선택한다. 마찬가지로 이 글자가 B에서도 여러 번 등장하면 B에서 제일 처음 나오는 것을 선택한다. 예를 들어, A = "ABBA

www.acmicpc.net

 

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

블라인드  (0) 2019.06.30
블랙잭  (0) 2019.06.30
컵홀더  (0) 2019.06.30
ALPS식 투표  (0) 2019.06.30
숫자 정사각형  (0) 2019.06.30

문제

처음에 문제를 보았을 때 생각을 하였지만 포인트를 알면 쉽게 해결되는 문제이다.

포인트는 "S"일때 count를 해주고 L일때는 커플석이기 때문에 한단계 건너로 넘어가면서 count를 해주면된다.

(주의사항! 컵홀더는 사람의 수보다 많을 수 없다!)

 

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
import java.util.*;
 
public class Main{
    public static int count=1;
    public static int lCount=0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number=sc.nextInt();
        String str=sc.next();
        
        for(int i=0;i<str.length();i++)
            if(str.charAt(i)=='S')
            {
                count++;
            }
            else{
                i++
                count++;
            }
        if(number>count)
        {
            System.out.println(count);
        }
        else
        {
            System.out.println(number);
        }
    }
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

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

 

2810번: 컵홀더

문제 십년이면 강산이 변한다. 강산이네 동네에 드디어 극장이 생겼고, 강산이는 극장에 놀러갔다. 매점에서 콜라를 산 뒤, 자리에 앉은 강산이는 큰 혼란에 빠졌다. 양쪽 컵홀더를 이미 옆 사람들이 차지했기 때문에 콜라를 꽂을 컵 홀더가 없었기 때문이다. 영화를 보는 내내 콜라를 손에 들고 있던 강산이는 극장에 다시 왔을 때는 꼭 콜라를 컵 홀더에 놓겠다는 다짐을 한 후 집에 돌아갔다. 극장의 한 줄에는 자리가 N개가 있다. 서로 인접한 좌석 사이에는 컵홀더

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

+ Recent posts