반응형

한양대학교는 2023년부터 Hanyang Popularity Exceeding Competition을 열게 되었다. 이 대회는 일정 기간 진행되며, 대회가 끝나는 시점에 인기도가 가장 높은 학생이 우승한다. 철민이는 Hanyang Popularity Exceeding Competition의 참가자이지만, 이제 막 학교에 다니기 시작한 철민이는 인기도가 밖에 되지 않는다.

철민이는 한양대학교 내의 유명인 명과 만난다는 우승 계획을 세웠다. 이를 위해 철민이는 번 유명인부터 번 유명인까지 차례대로 만날 계획을 세웠다.

하지만 현실은 생각보다 복잡해서, 유명인들과 만난다고 항상 인기도가 올라가지는 않는다. 한쪽의 유명도가 다른 한쪽에 비해 너무 높으면 한쪽의 인기에 다른 쪽이 묻혀버리기 때문이다. 엄밀히 말해서, 철민이의 현재 인기도를 라고 하고, 번 유명인의 인기도를 , 친화력을 라고 하자. 이때, 여야 철민이의 인기도가  올라간다. 라면 철민이의 인기도는 변하지 않는다.

그래서 철민이는 모든 유명인을 다 만나는 대신, 일부 유명인만을 골라 만나서 인기도를 최대화하려고 한다. 이때, 철민이가 도달할 수 있는 최대 인기도는 얼마일까?

유명인들은 바쁜 삶을 보내기 때문에, 유명인과 만나는 시간을 변경할 수는 없다. 즉, 번호가 더 높은 유명인을 먼저 만나도록 계획을 변경할 수는 없다.

제약조건

입력형식

첫 번째 줄에 한양대학교의 유명인들의 수 이 주어진다.

다음 개의 줄의 번째 줄에는 번 유명인의 인기도와 친화력을 의미하는 두 정수  가 공백으로 구분되어 주어진다.

출력형식

첫 번째 줄에 철민이가 도달할 수 있는 최대 인기도를 출력한다.

입력예제1
3 1 1 0 0 2 1
출력예제1
2

 

아래 방식으로 만남을 계획하면 인기도를 최대화할 수 있다.

  •  1번 유명인은 만나지 않고 건너뛴다.
  •  2번 유명인을 만난다. |0 − 0| ≤ 0이므로 철민이의 인기도가 1이 된다.
  •  3번 유명인을 만난다. |1 − 2| ≤ 1이므로 철민이의 인기도가 2가 된다.
입력예제2
5 0 0 0 1 0 2 0 3 0 4
출력예제2
5

 

모든 유명인을 만나면 인기도를 최대로 올릴 수 있다.

 

입력예제3
3 4 3 3 2 2 1
출력예제3
0

 

어떤 방식으로 만남을 계획해도 철민이의 인기도가 오를 수 없다.

 

 

[Solution]

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int X = 0;
        
        for(int i=0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int P = Integer.parseInt(st.nextToken());
            int C = Integer.parseInt(st.nextToken());

            int absoluteValue = 0 ;
            if((P-X) < 0){
                absoluteValue = (P-X)*-1;
            }else{
               absoluteValue = (P-X); 
            } 

            if(absoluteValue <= C){
                X++;
            }
            
        }

        System.out.println(X);
    }
}
반응형
블로그 이미지

Mr.비타민

,
반응형

현대자동차그룹은 주요 물류센터에 각종 자동화 기기를 도입하며 ‘스마트 물류’를 실현하고 있다. 최근에는 자동차 반조립 부품(KD, Knock-Down) 물류기지인 KD센터에 포장 관련 자동화 로봇 개발과 구축을 완료했다. 기존 수작업으로 진행하던 일부 작업 라인을 자동화 기기로 전환해 생산성을 높이기 위한 시도다. 기다란 작업 라인에 로봇과 부품이 아래 그림과 같이 단위 간격으로 놓여 있다. 로봇들의 위치에서 거리가 K 이하인 부품만 잡을 수 있다. 왼쪽 오른쪽은 상관 없다.



위 그림에서 K = 1인 경우를 생각해보자. 이 경우 모든 로봇은 그의 위치 바로 옆에 인접한 부품만 집을 수 있다.

* 10번 위치에 있는 로봇은 바로 왼쪽 11번 위치에 있는 부품을 집을 수 있다. 이 경우 다음과 같이 최대 5개의 로봇이 부품을 집을 수 있다.
* 2번 위치에 있는 로봇은 1번 위치에 있는 부품을 집을 수 있다.
* 4번 위치에 있는 로봇은 5번 위치에 있는 부품을 집을 수 있다.
* 6번 위치에 있는 로봇은 7번 위치에 있는 부품을 집을 수 있다.
* 9번 위치에 있는 로봇은 8번 위치에 있는 부품을 집을 수 있다.
* 10번 위치에 있는 로봇은 11번 위치에 있는 부품을 집을 수 있다.
* 12번 위치에 있는 로봇은 집을 수 있는 부품이 없다.

만약 K = 2라고 한다면 다음과 같이 6개 로봇 모두가 부품을 집을 수 있다.

* 2번 위치에 있는 로봇은 1번 위치에 있는 부품을 집을 수 있다.
* 4번 위치에 있는 로봇은 3번 위치에 있는 부품을 집을 수 있다.
* 6번 위치에 있는 로봇은 5번 위치에 있는 부품을 집을 수 있다.
* 9번 위치에 있는 로봇은 7번 위치에 있는 부품을 집을 수 있다.
* 10번 위치에 있는 로봇은 8번 위치에 있는 부품을 집을 수 있다.
* 12번 위치에 있는 로봇은 11번 위치에 있는 부품을 집을 수 있다.

라인의 길이 N, 부품을 집을 수 있는 거리 K, 그리고 로봇과 부품의 위치가 주어졌을 때 부품을 집을 수 있는 로봇의 최대 수를 구하는 프로그램을 작성하라.

 

제약조건

1 ≤ N ≤ 20,000

1 ≤ K ≤ 10

 

입력형식

입력의 첫 줄에는 두 정수 N과 K가 나온다.

다음 줄에는 로봇과 부품의 위치가 문자 P(로봇)와 H(부품)로 이루어지는 길이 N인 문자열로 주어진다.

 

출력형식

입력에 대해서 부품을 집을 수 있는 최대 로봇 수(정수)를 나타낸다.

 

입력예제1

20 1

HHPHPPHHPPHPPPHPHPHP

 

출력예제1

8

 
입력예제2

20 2

HHHHHPPPPPHPHPHPHHHP

 

출력예제2

7

 

 

 

[Solution]

로봇 왼쪽 먼 곳부터 오른쪽으로 순차적으로 차례대로 체크하면서 집는다고 생각하고 구현.

 

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
		
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int count = 0;
        char[] str = br.readLine().toCharArray();
		
	for (int i = 0; i < N; i++) {
		if (str[i] == 'P') {
			for (int j = i - K; j <= i + K; j++) {
				if (j < 0 || j >= N){
					continue;
				}else if (str[j] == 'H') {
					str[j] = '*';
					count++;
					break;
				}
			}
		}
	}
        System.out.println(count);
    }
}
반응형
블로그 이미지

Mr.비타민

,
반응형

이번에는 Statement가 아닌 PreparedStatement를 활용하여 

데이터를 핸들링하는 예제를 작성해보자.


JdbcConnector.java

package com.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.bean.UserBean;


public class JdbcConnector {
	
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		
		//DB 종료에 따른 JDBC DRIVER 클래스
		Class.forName("com.mysql.jdbc.Driver");
		
		//DB접속 url
		String url = "jdbc:mysql://localhost/test";
		//DB접속 ID
		String id = "root";
		//DB접속 패스워드
		String pw = "1234";
		
		//접속정보로 JDBC 연결 커넥션 생성
		Connection conn = DriverManager.getConnection(url,id,pw);
		
		return conn;
	}
	public static void main(String args[]) throws ClassNotFoundException, SQLException {
		//커넥션생성
		Connection conn = getConnection();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		UserBean user = new UserBean();
		user.setId("pby0716");
		user.setName("박병영");
		user.setEmail("pby0716@naver.com");
		
		String sql1 = "INSERT INTO MEMBER(ID,NAME,EMAIL) VALUES (?,?,?)";
		
		//PreaparedStatement 생성 후 실행할 쿼리정보 등록
		pstmt = conn.prepareStatement(sql1);
		
		//?에 대한 하는 가변부분 셋팅
		pstmt.setString(1, user.getId());
		pstmt.setString(2, user.getName());
		pstmt.setString(3, user.getEmail());
		
		int count = pstmt.executeUpdate();
		if(count > 0) {
			System.out.println("Insert 성공");
		}else {
			System.out.println("Insert 실패");
		}
		
		/*Insert 한 데이터를 조회하는 예제*/
		
		//받아올 id를 담으면 된다. 지금은 예제로써 임의로 담아두었다.
		String id = "pby0716";
		
		//실행 쿼리
		String sql2 = "SELECT ID, NAME, EMAIL FROM MEMBER WHERE ID = ?";
		//PreaparedStatement 생성 후 실행할 쿼리정보 등록
		pstmt = conn.prepareStatement(sql2);
		//위 sql에 담겨있는 쿼리에 가변하는 변수(id)를 세팅하는 부분
		pstmt.setString(1, id);
		
		//결과를 담을 ResultSet 생성 후 결과 담기
		rs = pstmt.executeQuery();
		
		//결과를 담을 ArrayList생성
		ArrayList<UserBean> list = new ArrayList<UserBean>();
		
		//ResultSet에 담긴 결과를 ArrayList에 담기
		while(rs.next()) {
			UserBean bean = new UserBean();
			bean.setId(rs.getString("ID"));
			bean.setName(rs.getString("NAME"));
			bean.setEmail(rs.getString("EMAIL"));
			list.add(bean);
		}
		//결과물 출력
		for(int i=0; i<list.size(); i++) {
			System.out.println("회원아이디:"+list.get(i).getId());
			System.out.println("회원이름:"+list.get(i).getName());
			System.out.println("회원이메일:"+list.get(i).getEmail());
		}
	}
}

이전에 사용했던 Statement와 PreparedStatement의 차이가 무엇일까?


Statement의 경우에는 완성형 쿼리를 담아서 실행을 하게되지만,

PreparedStatement의 경우에는 가변처리되어야하는 부분에 대해서 ?로 처리하여 쿼리를 바인딩한 후에도 핸들링하여 사용할 수 있다.


완전한 쿼리가 실행될때는 Statement객체를 사용하는 것이 속도측면에서 빠르며,

불완전한 쿼리를 가변처리를 하며 반복적으로 사용할 경우에는 PreparedStatement객체를

사용하는 것이 빠르다.


예제소스에서도 보듯이 Statement의 경우에는 실행하기직전에 쿼리를 담아서 컴파일처리를 하며, PreparedStatement의 경우에는 객체 생성시에 쿼리를 미리 담아서 ?에 대한부분을 미리 처리한 후 컴파일해놓고 처리를 한다.


때에 따라서 해당 두가지를 적절히 사용하면, DB속도 및 소프트웨어 속도 면에서 향상된 프로그램을 개발할 수 있다.!


반응형
블로그 이미지

Mr.비타민

,
반응형

JAVA에서 프래그램을 작성하다보면 DB에 연결하여 데이터를 가져와야하는 경우가 많다.


해당 방법을 위하여 Connection 부터 데이터 처리까지의 방법을 확인해보자.



JdbcConnector.java

package com.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.bean.UserBean;


public class JdbcConnector {
	
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		
		//DB 종료에 따른 JDBC DRIVER 클래스
		Class.forName("com.mysql.jdbc.Driver");
		
		//DB접속 url
		String url = "jdbc:mysql://localhost/test";
		//DB접속 ID
		String id = "root";
		//DB접속 패스워드
		String pw = "1234";
		
		//접속정보로 JDBC 연결 커넥션 생성
		Connection conn = DriverManager.getConnection(url,id,pw);
		
		return conn;
	}
	public static void main(String args[]) throws ClassNotFoundException, SQLException {
		//커넥션생성
		Connection conn = getConnection();
		//실행 쿼리
		String sql = "SELECT ID, NAME, EMAIL FROM MEMBER";
		//Statement 생성 후 실행할 쿼리정보 등록
		Statement stmt = conn.createStatement();
		//결과를 담을 ResultSet 생성 후 결과 담기
		ResultSet rs = stmt.executeQuery(sql);
		
		//결과를 담을 ArrayList생성
		ArrayList<UserBean> list = new ArrayList<UserBean>();
		
		//ResultSet에 담긴 결과를 ArrayList에 담기
		while(rs.next()) {
			UserBean bean = new UserBean();
			bean.setId(rs.getString("ID"));
			bean.setName(rs.getString("NAME"));
			bean.setEmail(rs.getString("EMAIL"));
			list.add(bean);
		}
		//결과물 출력
		for(int i=0; i<list.size(); i++) {
			System.out.println("회원아이디:"+list.get(i).getId());
			System.out.println("회원이름:"+list.get(i).getName());
			System.out.println("회원이메일:"+list.get(i).getEmail());
		}
	}
}

UserBean.java

package com.bean;

public class UserBean {
	String id;
	String name;
	String email;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

출력물 : 
회원아이디:pby0716
회원이름:박병영
회원이메일:pby0716@naver.com
회원아이디:qudduddl
회원이름:박병영
회원이메일:young3629@gamil.com


2가지의 데이터가 출력이 된다.

다음장에는 PreparedStatement를 사용하여 Insert, Select를 핸들링하는 방법을 확인해보자.


반응형
블로그 이미지

Mr.비타민

,