Algorithm/Problem Solving 2020. 4. 17. 20:50

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/2156

 

사용 알고리즘

- DP

 

풀이

- d[i][j] = i번째 포도주까지 마셨을 때의 최대 포도주의 양. i번째 포도주는 j번 연속으로 마심

- d[i][0] = max(d[i - 1][0], d[i - 1][1], d[i - 1][2])

- d[i][1] = d[i - 1][0] + p[i]

- d[i][2] = d[i - 1][1] + p[i]

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/2156.cpp

#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int d[10003][3];
int p[10003];
 
int main(void) {
    int n; scanf("%d"&n);
    for (int i = 1; i <= n; ++i) scanf("%d"&p[i]);
    for (int i = 1; i <= n; ++i) {
        d[i][0= max(d[i - 1][0], max(d[i - 1][1], d[i - 1][2]));
        d[i][1= d[i - 1][0+ p[i];
        d[i][2= d[i - 1][1+ p[i];
    }
    printf("%d\n", max(d[n][0], max(d[n][1], d[n][2])));
    return 0;
}

Colored by Color Scripter

cs

 

'Algorithm > Problem Solving' 카테고리의 다른 글

[BOJ/11055] 가장 큰 증가 부분 수열  (0) 2020.04.18
[BOJ/11053] 가장 긴 증가하는 부분 수열  (0) 2020.04.17
[BOJ/9465] 스티커  (0) 2020.04.16
[BOJ/11057] 오르막 수  (0) 2020.04.16
[BOJ/10844] 쉬운 계단 수  (0) 2020.04.14
posted by DevMoomin
:
Spring/Study 2020. 4. 17. 20:17

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

@ModelAttribute

@ModelAttirbute를 이용하면 커멘드 객체의 이름을 변경할 수 있고, 이렇게 변경된 이름은 뷰에서 커멘드 객체를 참조할 때사용된다.

MemberController.java

@RequestMapping(value = "/memRemove", method = RequestMethod.POST)
public String memRemove(@ModelAttribute("mem") Member member) {    
    service.memberRemove(member);    
    return "memRemoveOk";
}
cs

memRemoveOk.jsp

ID : ${mem.memId}<br />
cs

 

커맨드 객체 프로퍼티 데이터 타입

memJoin.html

<form action="/lec19/member/memJoin" method="post">
    ID : <input type="text" name="memId" ><br />
    PW : <input type="password" name="memPw" ><br />
    MAIL : <input type="text" name="memMail" ><br />
    PHONE1 : <input type="text" name="memPhones[0].memPhone1" size="5"> -
             <input type="text" name="memPhones[0].memPhone2" size="5"> -
             <input type="text" name="memPhones[0].memPhone3" size="5"><br />
    PHONE2 : <input type="text" name="memPhones[1].memPhone1" size="5"> -
             <input type="text" name="memPhones[1].memPhone2" size="5"> -
             <input type="text" name="memPhones[1].memPhone3" size="5"><br />
    <input type="submit" value="Join" >
    <input type="reset" value="Cancel" >
</form>
cs

Member.java

public class Member {
    private String memId;
    private String memPw;
    private String memMail;
    private List<MemPhone> memPhones;
    
    public String getMemId() {
        return memId;
    }
    public void setMemId(String memId) {
        this.memId = memId;
    }
    public String getMemPw() {
        return memPw;
    }
    public void setMemPw(String memPw) {
        this.memPw = memPw;
    }
    public String getMemMail() {
        return memMail;
    }
    public void setMemMail(String memMail) {
        this.memMail = memMail;
    }
    public List<MemPhone> getMemPhones() {
        return memPhones;
    }
    public void setMemPhones(List<MemPhone> memPhones) {
        this.memPhones = memPhones;
    }
}
cs

 

Model & ModelAndView

Controller에서 View에 데이터를 전달하기 위해 사용되는 객체로 Model과 ModelAndView가 있다. Model은 뷰에 데이터만을 전달하기 위한 객체이고, ModelAndView는 데이터와 뷰의 이름을 함께 전달하는 객체이다.

@RequestMapping(value = "/memModify", method = RequestMethod.POST)
public String memModify(Model model, Member member) {    
    Member[] members = service.memberModify(member);
        
    model.addAttribute("memBef", members[0]);
    model.addAttribute("memAft", members[1]);
        
    return "memModifyOk";
}
cs

 

@RequestMapping(value = "/memModify", method = RequestMethod.POST)

public ModelAndView memModify(Member member) {        

    Member[] members = service.memberModify(member);

        

    ModelAndView mav = new ModelAndView();

    mav.addObject("memBef", members[0]);

    mav.addObject("memAft", members[1]);

        

    mav.setViewName("memModifyOk");

    

    return mav;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 17. 19:54

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

@RequestMapping을 이용한 URL 매핑

@RequestMapping 어노테이션은 http request로 들어오는 URL을 특정 Controller 클래스나 메소드로 연결시켜주는 역할을 한다.

@RequestMapping(value="/memJoin", method=RequestMethod.GET)과 같이 value와 method 속성을 사용할 수 있는데, method의 Default 값은 GET이므로 method를 명시하지 않으면 자동으로 GET 요청을 처리한다.  method 없이 value만 사용할 경우 이름을 생략하여 @RequestMapping("memJoin")과 같이 사용 가능하다.

메소드에 @RequestMapping 적용

public class MemberController {
    @Resource(name="memService")
    MemberService service;
    
    @RequestMapping(value="/member/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

클래스에 @RequestMapping 적용

@RequestMapping("/member")
public class MemberController {
    @Resource(name="memService")
    MemberService service;
    
    @RequestMapping(value="/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

 

요청 파라미터

HttpServletRequest 객체를 이용한 HTTP 전송 정보 얻기

login.html

ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
cs

MemberController.java

@RequestMapping("/member")
public class MemberController {
    @Resource(name="memService")
    MemberService service;
 
    @RequestMapping(value="/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

 

@RequestParam 어노테이션을 이용한 HTTP 전송 정보 얻기

login.html

ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
cs

MemberController.java

@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, @RequestParam("memId"String memId, @RequestParam("memPw"String memPw) {    
    Member member = service.memberSearch(memId, memPw);
        
    model.addAttribute("memId", member.getMemId());
    model.addAttribute("memPw", member.getMemPw());
                
    return "memLoginOk";
}
cs

 

커멘드 객체를 이용한 HTTP 전송 정보 얻기

memJoin.html

<form action="/lec18/member/memJoin" method="post">
    ID : <input type="text" name="memId" ><br />
    PW : <input type="password" name="memPw" ><br />
    MAIL : <input type="text" name="memMail" ><br />
    PHONE : <input type="text" name="memPhone.memPhone1" size="5"> -
            <input type="text" name="memPhone.memPhone2" size="5"> -
            <input type="text" name="memPhone.memPhone3" size="5"><br />
    AGE : <input type="text" name="memAge" size="4"><br />
            <input type="submit" value="Join" >
            <input type="reset" value="Cancel" >
</form>
cs

Member.java

public class Member {
    private String memId;
    private String memPw;
    private String memMail;
    private MemPhone memPhone;
    
    public String getMemId() {
        return memId;
    }
    public void setMemId(String memId) {
        this.memId = memId;
    }
    public String getMemPw() {
        return memPw;
    }
    public void setMemPw(String memPw) {
        this.memPw = memPw;
    }
    public String getMemMail() {
        return memMail;
    }
    public void setMemMail(String memMail) {
        this.memMail = memMail;
    }
    public MemPhone getMemPhone() {
        return memPhone;
    }
    public void setMemPhone(MemPhone memPhone) {
        this.memPhone = memPhone;
    }
}
cs

MemberController.java

@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Member member) {    
    service.memberRegister(member);        
    return "memJoinOk";
}
cs

memberJoinOk.jsp

 

ID : ${member.memId}<br />

PW : ${member.memPw}<br />

Mail : ${member.memMail} <br />

Phone : ${member.memPhone.memPhone1} - ${member.memPhone.memPhone2} - ${member.memPhone.memPhone3}<br />

 

cs

posted by DevMoomin
:
ETC 2020. 4. 17. 00:21

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

VMware는 가상머신의 한 종류이다. 가상머신이란 하나의 PC에서 가상 PC를 통해 여러 종류의 OS (Operation System)를 사용 가능하도록 해주는 프로그램이다. 간단히 말하면, Windows 내에서도 Linux 환경을 사용할 수 있도록 해준다. 가상머신은 VMware와 VirtualBox를 주로 사용하는데, VirtualBox는 무료인 반면에, VMware는 유료라는 단점이 있다.

 

VirtualBox 설치 : https://devmoomini.tistory.com/86

 

1. VMware 공식 사이트에 접속 (https://www.vmware.com/)

2. 상단의 다운로드 - 무료 제품 평가판 및 데모 - Workstation Pro 클릭

3. 자신의 OS버전에 맞게 지금 다운로드 클릭

4. 다운받은 파일을 실행시키고, Next 클릭

5. I accept the terms in the License Agreement 체크 후 Next 클릭

6. Enhanced Keyboard Driver 체크 후, Next 클릭

7. Next 클릭

8. Next 클릭

9. Install 클릭

10. Finish를 클릭하여 설치 완료

11. 설치된 파일을 실행하고 I want to try VMware Workstation 15 for 30 days를 선택 후 Continue 클릭

12. Finish 클릭

13. VMware 정상 실행되는 것 확인

'ETC' 카테고리의 다른 글

VirtualBox 설치  (0) 2020.04.17
운영체제 버전 확인  (0) 2020.04.16
Windows Git 설치  (0) 2020.04.07
posted by DevMoomin
:
ETC 2020. 4. 17. 00:10

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

VirtualBox는 가상머신의 한 종류이다. 가상머신이란 하나의 PC에서 가상 PC를 통해 여러 종류의 OS (Operation System)를 사용 가능하도록 해주는 프로그램이다. 간단히 말하면, Windows 내에서도 Linux 환경을 사용할 수 있도록 해준다. 가상머신은 VMware와 VirtualBox를 주로 사용하는데, VMware는 유료인 반면에, VirtualBox는 무료로 사용할 수 있다는 장점이 있다.

 

VMware 설치 : https://devmoomini.tistory.com/87

 

1. VirtualBox 공식 사이트에 접속 (https://www.virtualbox.org/)

2. 중간에 있는 Download VirtualBox 6.1 클릭

3. 자신의 OS버전에 맞는 파일 클릭 

4. 다운 받은 파일을 실행시키고, Next 클릭

5. Next 클릭 (설치경로 변경을 원한다면 Browse를 클릭하여 변경 후 Next 클릭)

6. Next 클릭

7. Yes 클릭

8. Install 클릭

9. Finish를 클릭하여 설치 완료

10. VirtualBox 정상 실행되는 것 확인

 

'ETC' 카테고리의 다른 글

VMware 설치  (0) 2020.04.17
운영체제 버전 확인  (0) 2020.04.16
Windows Git 설치  (0) 2020.04.07
posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 16. 22:59

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/9465

 

사용 알고리즘

- DP

 

풀이

- d[i][j] = 2 * i개의 스티커에서 얻을 수 있는 최대점수, i번째 열에서 뜯는 스티커는 j

- d[i][0] = max(d[i - 1][0], d[i - 1][1], d[i - 1][2]) (j = 0 : 위, 아래 모두 뜯지 않음)

- d[i][1] = max(d[i - 1][0], d[i - 1][2]) + p[i][0] (j = 1 : 위만 뜯음)

- d[i][2] = max(d[i - 1][0], d[i - 1][1]) + p[i][1] (j = 2 : 아래만 뜯음)

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/9465.cpp

#include <cstdio>

#include <algorithm>

 

using namespace std;

 

int d[100003][3];

int arr[100003][2];

 

int main(void) {

    int t; for (scanf("%d"&t); t--;) {

        int n; scanf("%d"&n);

        for (int i = 0; i < n; ++i) scanf("%d"&arr[i][0]);

        for (int i = 0; i < n; ++i) scanf("%d"&arr[i][1]);

        d[0][1= arr[0][0]; d[0][2= arr[0][1];

        for (int i = 1; i < n; ++i) {

            d[i][0= max(d[i - 1][0], max(d[i - 1][1], d[i - 1][2]));

            d[i][1= max(d[i - 1][0], d[i - 1][2]) + arr[i][0];

            d[i][2= max(d[i - 1][0], d[i - 1][1]) + arr[i][1];

        }

        printf("%d\n", max(d[n - 1][0], max(d[n - 1][1], d[n - 1][2])));

    }

    return 0;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Algorithm/Problem Solving 2020. 4. 16. 22:52

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

문제 링크

- https://www.acmicpc.net/problem/11057

 

사용 알고리즘

- DP

 

풀이

- d[i][j] = i자리 오르막 수의 개수, i번째 자리의 수는 j

- d[1][i] = 1

- d[i][j] += d[i - 1][k] (0 <= k <= j)

 

소스 코드

- https://github.com/moomini/algorithm/blob/master/boj/11057.cpp

#include <cstdio>

 

int d[1003][10];

 

int main(void) {

    int n; scanf("%d"&n);

    for (int i = 0; i <= 9++i) d[1][i] = 1;

    for (int i = 2; i <= n; ++i) {

        for (int j = 0; j <= 9++j) {

            for (int k = 0; k <= j; ++k) {

                d[i][j] += d[i - 1][k];

                d[i][j] %= 10007;

            }

        }

    }

    int ans = 0;

    for (int i = 0; i <= 9++i) {

        ans += d[n][i];

        ans %= 10007;

    }

    printf("%d\n", ans);

    return 0;

}

Colored by Color Scripter

cs

'Algorithm > Problem Solving' 카테고리의 다른 글

[BOJ/11055] 가장 큰 증가 부분 수열  (0) 2020.04.18
[BOJ/11053] 가장 긴 증가하는 부분 수열  (0) 2020.04.17
[BOJ/2156] 포도주 시식  (0) 2020.04.17
[BOJ/9465] 스티커  (0) 2020.04.16
[BOJ/10844] 쉬운 계단 수  (0) 2020.04.14
posted by DevMoomin
:
Spring/Study 2020. 4. 16. 22:13

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

Service 객체 구현

@Service, @Component @Resource, @Repository 어노테이션을 이용하여 Service 객체 생성 및 자동주입이 가능하다. 어노테이션 뒤에 괄호로 이름을 넣어주기도 하는데, 이름을 빼고도 사용할 수 있다.

MemberController.java

@Controller
public class MemberController {
    @Resource(name="memService")
    MemberService service;
}
cs

MemberService.java

//@Service
//@Service("memService")
//@Component
//@Component("memService")
//@Repository
@Repository("memService")
public class MemberService implements IMemberService {
    @Autowired
    MemberDao dao;
}
cs

 

DAO 객체 구현

Service 객체와 마찬가지로 어노테이션을 이용하여 DAO 객체 생성 및 자동주입이 가능하다.

MemberController.java

@Controller
public class MemberController {
   @Resource
    MemberService service;
}
cs

MemberDao.java

@Repository
public class MemberDao implements IMemberDao {
    private HashMap<String, Member> dbMap;
    
    public MemberDao() {
        dbMap = new HashMap<String, Member>();
    }
}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 22:01

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

스프링(Spring)에서 한글의 깨짐을 방지하기 위해 UTF-8 형식으로 인코딩을 해주어야 한다. 웹 설정파일에서 <filter> 태그를 통해 인코딩이 가능하다.

 

web.xml

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
        
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
cs

 

실행 결과

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 21:16

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

프로젝트 전체 구조

1. java : 웹 애플리케이션에서 사용되는 Controller, Service, DAO 객체들의 java 파일의 위치

2. webapp : 스프링 설정파일, JSP, HTML 등 웹과 관련된 파일의 위치

3. resources : JSP 파일을 제외한 html, css, js 파일 등의 위치

4. spring : 스프링 설정파일의 위치

5. views : JSP 파일의 위치

6. xeb.xml : 웹 설정파일

7. pom.xml : Maven 설정 파일

 

web.xml

웹 애플리케이션에 최초 사용자의 요청이 발생하면 가장 먼저 DispatcherServlet이 사용자의 요청을 받는데, 개발자는 DispatcherServlet을 서블릿으로 등록해주어야 한다. 모든 사용자의 요청을 받기 위해 root를 의미하는 / 로 URL을 매핑한다.

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
cs

 

DispatcherServlet

- HandlerMapping : 적합한 Controller를 선택

- HandlerAdapter : 해당하는 Controller 내에서 가장 적합한 메소드를 선택

- ViewResolver : 가장 적합한 JSP 파일 선택

 

servlet-context.xml

웹 설정파일인 web.xml에 스프링 설정파일의 역할을 하는 파일로 지정되어있다. 클래스로부터 빈(Bean) 객체를 생성하고 조립하는 역할

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>
cs

 

Controller

사용자의 요청을 실체로 처리하는 부분

@Controller
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        
        String formattedDate = dateFormat.format(date);
        
        model.addAttribute("serverTime", formattedDate );
        
        return "home";
    }
}    
cs

 

View

클라이언트 요청정보(URL 매핑 값)에 해당하는 JSP파일 실행

posted by DevMoomin
: