728x90
반응형

1. 영화진흥위원회 사이트에 들어가서 회원가입을 한다.

 

영화진흥위원회: https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do

 

 

 

 

2. 키 발급/관리로 들어가서 키를 발급받는다.

키 발급받기를 눌러줍니다.

 

사용 목적과 관리명만 적으면 되는데, 사용 목적은 공부용 정도로 적어두셔도 괜찮고 관리명은 원하는대로 적어주시면 됩니다.

 

 

 

 

3. 키 발급/관리에서 발급키를 확인한다.

 

 

 

 

4. OPEN API에서 제공서비스를 누르고 원하는 정보의 페이지로 이동한다.

* 일별 박스오피스로 실습을 해보겠습니다.

 

 

5. 아래로 내려서 응답 예시를 확인하고 예시를 긁어서 웹사이트에서 열어본다.

JSON 응답 예시를 활용하겠습니다.

잘 보시면 두번째 줄에 key와 targetDt가 있는 모습을 볼 수 있습니다.

 

key와 targetDt는 요청 인터페이스에서 확인할 수 있습니다. 원하는대로 사용하시면 됩니다.

ex) 영화를 5개만 띄우고 싶다면 &itemPerPage=5을 추가합니다.

 

 

*20210510일자 일별 박스오피스 and 5개만 출력하도록 지정한 것

http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20210510&itemPerPage=5

 

 

-결과 모습-

 

 

6. 파이썬으로 크롤링한다.

 

import requests
import json

url = 'http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20210511'
res = requests.get(url)
text= res.text

d = json.loads(text)
print(d)

혹시 requests, json 모듈이 설치되어있지 않다면 이 글을 확인하시기 바랍니다.

https://fjdkslvn.tistory.com/28

 

 

 

웹페이지에서 봤던 결과를 파이썬으로 확인할 수 있습니다.

 

boxOfficeResult 안에 dailyBoxOfficeList가 있는것을 확인할 수 있고, 각각의 dailyBoxOfficeList들이 영화 한편씩을 의미하는 것을 볼 수 있습니다.

 

 

7. 이것을 활용하여 원하는 정보만 csv 형식으로 뽑아낸다.

 

응답 구조에 있는 변수들을 잘 활용하여 코드를 작성하면 됩니다.

 

 

import requests
import json
import pandas as pd

url = 'http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=6e927f984e0745787469e2452351991a&targetDt=20210511'
res = requests.get(url)
text= res.text

d = json.loads(text)

movie_list = []

for b in d['boxOfficeResult']['dailyBoxOfficeList']:
    movie_list.append([b['rank'],b['movieNm'],b['audiCnt']])


data = pd.DataFrame(movie_list)
data.to_csv("movie_list.txt", mode='w', encoding='utf-8', index=False)

boxOfficeResult 안에 dailyBoxOfficeList의 영화 정보에서 원하는 값을 뽑아서 movie_list 배열에 append로 추가하는 것 입니다.

 

현재 입력값은 rank(영화 등수), movieNm(영화이름 국문), audiCnt(관객 수) 입니다.

 

**Python 복수변수 입력시 x.append([a,b,c]) 형태로 작성해야함**

 

 

- csv 도출 결과 -

728x90
반응형
728x90
반응형

Java 문제풀이

import java.util.Scanner;

public class b_1439 {
    public static void main(String[] args) {
        String coin;
        int zero=0, one=0,sum_one=0, sum_zero=0;
        Scanner scanner = new Scanner(System.in);

        coin = scanner.next();
        int length = coin.length();

        int []coin_c = new int[length];
        char x;

        for(int i=0; i<length;i++){
            x = coin.charAt(i);
            coin_c[i] = Character.getNumericValue(x);
            if(coin_c[i] == 0){
                zero++;
            }
            else{
                one++;
            }
        }

        for(int i=0;i<length-1;i++){
            if(coin_c[i]==1 && coin_c[i+1]!=1){
                sum_one++;
            }
        }
        if(coin_c[length-1]==1){
            sum_one++;
        }
        
        
        for(int i=0;i<length-1;i++){
            if(coin_c[i]==0 && coin_c[i+1]!=0){
                sum_zero++;
            }
        }
        if(coin_c[length-1]==0){
            sum_zero++;
        }
        
        if(sum_zero>sum_one){
            System.out.println(sum_one);
        }
        else{
            System.out.println(sum_zero);
        }

    }
}

어쩌면 비효율적인 코드라고 생각합니다.

 

1을 뒤집는 방식과, 0을 뒤집는 방식 모두 집계를 하여 그중에서 덜 뒤집은 횟수를 답으로 출력하는 방식입니다.

 

세부기능 코드를 보면, 문자열로 긴 숫자를 입력받고, 그것을 숫자 배열로 변환합니다.

 

이후에는 전체에서 1을 뒤집는 경우와 0을 뒤집는 경우를 집계하는 코드입니다.

 

연속된만큼 뒤집어주는거기 때문에, 1을 뒤집는 경우에서는 숫자 배열을 보고 현재 값이 1이고 다음 배열값이 1이면 아직 마지막 1이 아니기 때문에 넘어가고, 현재값이 1인데 다음값이 0이면 현재가 마지막 1이기 때문에 연속된 만큼 한번 뒤집게 되니 카운트를 ++ 해줍니다. 그리고 마지막 배열 값은 어떤 경우에든 1이면 무조건 카운트 되기 때문에 1이면 카운트 되도록 해주었습니다.

 

0을 집계하는 방식도 마찬가지입니다.

 

그렇게 둘중에서 뒤집는 수가 더 적은것을 출력합니다. 같은경우는 아무거나 출력해도 됩니다.

 

 

결과

728x90
반응형
728x90
반응형

Java 문제풀이

import java.util.Scanner;

public class b_1434{
    public static void main(String[] args) {
        int n,m,x=0, sum=0, box_sum=0;
        Scanner scanner = new Scanner(System.in);
        
        n = scanner.nextInt();
        m = scanner.nextInt();

        int []box = new int [n];
        int []book = new int [m];

        for(int i=0;i<n;i++){
            box[i] = scanner.nextInt();
        }

        for(int i=0;i<m;i++){
            book[i] = scanner.nextInt();
        }

        for(int i=0;i<m;i++){
            while(true){
                if(box[x]<book[i]){
                    x++;
                }
                else{
                    box[x] -= book[i];
                    break;
                }
            }
        }

        for(int i=0;i<n;i++){
            sum += box[i];
        }

        System.out.println(sum);
    }
}

 

for문으로 책 갯수만큼 반복을 돌립니다.

 

while문을 통해 책이 들어갈때까지 반복을 돌립니다.

 

박스에 책이 안들어가면 다음 박스로 넘기고, 들어가면 박스공간에서 책 크기만큼 수를 빼주고 break를 시켜서 다음 책을 넣을 수 있도록 합니다.

 

책을 다 넣었으면 반복문이 끝납니다. 이후에는 남은 박스 공간의 크기를 전부 더하면 됩니다.

 

 

 

 

결과

728x90
반응형
728x90
반응형

Java 문제풀이

import java.util.Scanner;

public class b_11720 {
    public static void main(String[] args) {
        int n,sum=0;
        String x;
        char z;
        Scanner scanner = new Scanner(System.in);

        n = scanner.nextInt();
        x = scanner.next();

        for(int i=0;i<n;i++){
            z = x.charAt(i); //문자열의 값을 하나 뽑아옴
            sum += Character.getNumericValue(z);//char를 int로 변환
            //Integer.parseInt(z); 는 사용할 수 없음.
            //이건 문자열만 변환하는거라 char은 변환못함
            
        }
        System.out.println(sum);
    }
    
}

 

엄청나게 긴 숫자도 계산해야 하므로, 숫자 형태로 받아오는것이 불가능하기 때문에 문자열로 받아와서 끊어서 계산하는 형식의 문제라고 생각합니다.

 

이런 문제를 풀때는 정말 코딩테스트 언어로 파이썬이 편할지도 모르겠다는 생각이 듭니다.

 

문자열에서 각 문자를 뽑아서 연산하는게 불편하긴 하네요..ㅎㅎ 더 좋은 방법이 있을지도 모르겠습니다.

 

 

 

결과

728x90
반응형
728x90
반응형

Java 문제풀이

import java.util.Scanner;

public class b_1145 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int []a = new int [5];
        int x=1;

        for(int i=0;i<5;i++){
            a[i] = scanner.nextInt();
        }

    

        while(true){
            x++;
            int co;

            for(int i=0;i<5;i++){
                co=0;

                if(x%a[0]==0){
                    co++;
                }
                if(x%a[1]==0){
                    co++;
                }
                if(x%a[2]==0){
                    co++;
                }
                if(x%a[3]==0){
                    co++;
                }
                if(x%a[4]==0){
                    co++;
                }
                if(co>2){
                    System.out.println(x);
                    return;
                }
            }

        }

    }
}

 

솔직히 비효율적인 코드라고 생각합니다.

 

x의 값을 1씩 증가시켜서 나머지가 0이 되는 숫자가 3개 이상 나오면, 그 x값을 프린트하도록 만들었습니다.

 

더욱 효율적인 코드를 만들어보려고 했는데, 나름 괜찮아보인다고 생각했지만 틀렸다고 떠서 다음에 도전해봐야겠습니다.

 

 

 

결과

728x90
반응형
728x90
반응형

Java 문제풀이

public class b_5522 {
    public static void main(String[] args) {
        
        int []a = new int[5];
        int sum=0;
        Scanner scanner = new Scanner(System.in);

        for(int i=0;i<5;i++){
            a[i] = scanner.nextInt();
            sum += a[i];
        }
        System.out.println(sum);
        
    }
  }

간단합니다.

 

Scanner로 5개의 수를 입력받는 동시에 숫자를 sum에 더하면 됩니다.

 

 

결과

728x90
반응형

+ Recent posts