김기헌
Programmers
•
하샤드 수
public boolean solution(int x) {
int tmp = x, sum = 0;
while (0 < x) {
sum += x % 10;
x /= 10;
} //각각의 자리수 합 구하기
if (tmp % sum == 0)return true;
else return false;
}
Java
복사
•
나누어 떨어지는 숫자 배열
//List 사용
public int[] solution(int[] arr, int divisor) {
ArrayList<Integer> tmp = new ArrayList();
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) tmp.add(arr[i]);
}
if (tmp.size() == 0) return new int[]{-1};
Collections.sort(tmp);
int[] answer = new int[tmp.size()];
for (int i = 0; i < tmp.size(); i++) answer[i] = tmp.get(i);
return answer;
}
Java
복사
//Heap (우선순위 큐) 사용
public int[] solution(int[] arr, int divisor) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) pq.add(arr[i]);
}
if (pq.size() == 0) return new int[]{-1};
int[] answer = new int[pq.size()];
int pqSize = pq.size();
for (int i = 0; i < pqSize; i++) answer[i] = pq.poll();
return answer;
}
//Priority_Queue를 사용하여 따로 정렬해줄 필요가 없다
Java
복사
김상호
임학준
알고리즘
코드(List 사용)
코드(PriorityQueue 사용)
이번주 최종목표 - 게시판을 만들어 docker로 띄우기
springboot-mustache-bbs 만들기
bootstrap 적용
JPA 적용
조국현
최아영
알고리즘 실습
[프로그래머스] 하샤드 수
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한 조건
•
x는 1 이상, 10000 이하인 정수입니다.
문제 풀이
class Solution {
public boolean solution(int x) {
int sum = 0;
int num = x;
// 숫자의 자리수를 더한다.
while (x > 0) {
sum += x % 10;
x /= 10;
}
// 숫자를 더한 수로 나누어 떨어지면 참을 아니면 거짓을 반환한다.
return num % sum == 0;
}
}
Java
복사
[프로그래머스] 나누어 떨어지는 숫자 개수
문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한사항
•
arr은 자연수를 담은 배열입니다.
•
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
•
divisor는 자연수입니다.
•
array는 길이 1 이상인 배열입니다.
문제 풀이
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public int[] solution(int[] arr, int divisor) {
List<Integer> list = new ArrayList<>();
// 나누어 떨어지면 리스트에 추가한다.
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) list.add(arr[i]);
}
// 리스트가 비었으면 -1을 반환한다.
if(list.size() == 0) return new int[]{-1};
// list를 Array로 바꾼다
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
// 정렬하여 반환한다.
Arrays.sort(answer);
return answer;
}
}
Java
복사
import java.util.PriorityQueue;
class Solution {
public int[] solution(int[] arr, int divisor) {
PriorityQueue<Integer> list = new PriorityQueue<>();
for (int i=0; i<arr.length; i++) {
if (arr[i] % divisor ==0) {
list.add(arr[i]);
}
}
if (list.size() == 0) return new int[]{-1};
int[] answer = new int[list.size()];
int idx = 0;
while(!list.isEmpty()) {
answer[idx++] = list.poll();
}
return answer;
}
}
Java
복사
Spring Boot MVC
dependencies
•
Lombok
•
Spring Configuration Processor
•
Spring Web
•
Mustache
•
MySQL Driver
•
JPA
나중에 추가
화면에 출력하기
<MustacheController>
@GetMapping(value = "/hi")
public String mustacheCon1(Model model) {
model.addAttribute("username", "hi"); // view에 값을 넘김
return "greetings"; // greetings라는 이름의 view를 반환
}
Java
복사
<greetings.mustache>
<div>
<h1>{{username}} hello! <h1>
</div>
HTML
복사
id 입력받아 출력하기
<MustacheController>
@GetMapping(value = "/hi/{id}")
public String mustacheCon2(@PathVariable String id, Model model) {
model.addAttribute("username", "hi");
model.addAttribute("id", id);
return "greetings";
}
Java
복사
<greetings.mustache>
<div>
<h1>{{id}} {{username}} hello! <h1>
</div>
HTML
복사
문제점
•
mustache 파일에 id를 추가하고 http://localhost:8080/hi로 접근했을 때 오류가 발생한다.
•
한글이 깨진다.
접근 오류 해결
<greetings.mustache>
<div>
{{# id}}
<h1>{{id}} {{username}} hello! <h1>
{{/ id}}
{{^ id}}
<h1>{{username}} hello! <h1>
{{/ id}}
</div>
HTML
복사
한글 깨짐 해결
<application.yml>
server:
sevlet:
encoding:
force-response: true
YAML
복사
[적용 전]
[적용 후]
header와 footer
•
header와 footer를 추가하고 분리해 적용시킨다.
•
Bootstrap을 사용해 header에 NavBar를 추가했다.
<header.mustache>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Sping Boot Mustache</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<body>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js" integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.min.js" integrity="sha384-IDwe1+LCz02ROU9k972gdyvl+AESN10+x7tBKgc9I5HFtuNz0wWnPclzo6p9vxnk" crossorigin="anonymous"></script>
<nav class="navbar navbar-expand-lg bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link disabled">Disabled</a>
</li>
</ul>
<form class="d-flex" role="search">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</div>
</div>
</nav>
</body>
</html>
HTML
복사
<footer.mustache>
<div class="mb-5 container-fluid"> <hr>
<p>@ RokBoard <a href="">Privacy</a> <a href="#">Terms</a></p>
</div>
HTML
복사
<greetings.mustache>
{{>layouts/header}}
<div>
{{# id}}
<h1>{{id}} {{username}} hello! <h1>
{{/ id}}
{{^ id}}
<h1>{{username}} hello! <h1>
{{/ id}}
</div>
{{>layouts/footer}}
HTML
복사
폼 데이터 주고 받기
<ArticleController>
@Controller
@RequestMapping("/articles")
@Slf4j
public class ArticleController {
@GetMapping(value = "new")
public String newArticleForm() {
return "articles/new";
}
@PostMapping(value = "posts")
public String createArticle(ArticleDto form) {
log.info(form.toString()); // 로그 남기기
return "";
}
}
Java
복사
<new.mustache>
{{>layouts/header}}
<form action="/articles/posts" method="post">
<input type="text" name="title">
<input type="text" name="content">
<button type="submit" class="btn btn-primary">Submit</button>
<a href="/articles">back</a>
</form>
{{>layouts/footer}}
HTML
복사
JPA 사용
JPA dependency 추가
<build.gradle>
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
XML
복사
DB접속 정보 및 JPA 정보 추가
<application.yml>
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:8080/likelion-db
username: root
password: 123456
jpa:
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
database : mysql
hibernate.ddl-auto : update ❗초보자일 때 create 사용 금지
YAML
복사
Entity 선언
<Article>
@Entity
@NoArgsConstructor
@Getter
public class Article {
@Id
@GeneratedValue
private Long id;
private String title;
private String contents;
public Article(String title, String contents) {
this.title = title;
this.contents = contents;
}
}
Java
복사
<ArticleDto>
@Getter
@ToString
public class ArticleDto {
private Long id;
private String title;
private String content;
public ArticleDto(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
public Article toEntity() {
return new Article(title, content);
}
}
Java
복사
Repository 추가
<ArticleRepository.interface>
public interface ArticleRepository extends JpaRepository<Article, Long> {
}
Java
복사
<ArticleController>
@Controller
@RequestMapping("/articles")
@Slf4j
public class ArticleController {
private final ArticleRepository articleRepository;
public ArticleController(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}
@GetMapping(value = "new")
public String newArticleForm() {
return "articles/new";
}
@PostMapping(value = "posts")
public String createArticle(ArticleDto form) {
log.info(form.toString()); // 로그 남기기
Article article = form.toEntity();
articleRepository.save(article);
return "";
}
}
Java
복사
결과 화면
페이지에서 입력한 값이 DB로 잘 들어갔다.