김기헌
김상호
이가현
알고리즘
•
최대공약수
// 두수 a,b
//수중에 가장큰 한개가 최대공약수
//a>b , gcd(a-b,b)
//a<b , gcd(a, b-a)
//a==b , a,b가 최대 공약수
public class GreatestCommonDivisor {
public int gcd(int a, int b) {
if (a > b) return gcd(a - b, b);
else if (a < b) return gcd(a, b - a);
else if (a == b) return a;
return 1;
}
public static void main(String[] args) {
GreatestCommonDivisor divisor = new GreatestCommonDivisor();
System.out.println(divisor.gcd(196, 42));
}
}
Java
복사
임학준
조국현
최아영
알고리즘
[CodeUp] 2623 : 최대공약수 구하기
최대공약수 성질
1.
gcd(a, a)이면 최대 공약수는 a이다.
2.
gcd(a, b) = gcd(a, a + b)이다.
3.
a > b일 경우 gcd(a, b) = gcd(a - b, b)이다.
4.
gcd(a, b) = gcd(b, a)이다.
코드
public class Main {
public static int gcd(int a, int b) {
if (a == b) {
return a;
} else if (a > b) {
return gcd(a - b, b);
} else if (a < b) {
return gcd(a, b - a);
}
return 1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(gcd(a, b));
}
}
Java
복사
유클리드 호제법
1.
gcd(a, b) = 1이면, 두 수 a, b는 서로소 관계에 있다.
2.
a > b이어야 한다.
3.
a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면 gcd(a, b) = gcd(b, r)이다.
코드(재귀×)
public class Main {
public static void swap(int a, int b) {
int temp = a;
a = b;
b = a;
}
public static int euclidean(int a, int b) {
int r;
while (b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if (a < b) swap(a, b);
System.out.println(euclidean(a, b));
}
}
Java
복사
재귀
아래 코드를 실행하지 않고 출력해보기
•
recur(2)가 끝나야 print(3)과 recur(1)이 실행된다.
public static void recur(int n) {
if (n <= 0) return;
recur(n - 1);
System.out.println(n);
recur(n - 2);
}
public static void main(String[] args) {
recur(3);
}
Java
복사
결과
1
2
3
1
꼬리 재귀 빼기
•
마지막 재귀를 빼고 while로 바꿔도 결과는 같다.
public static void recur(int n) {
while(n > 0){
recur(n - 1);
System.out.println(n);
n = n - 2;
}
}
public static void main(String[] args) {
recur(3);
}
Java
복사
Spring Boot JPA
리뷰 한 개 조회
GET /api/v1/reviews/{id}
•
리뷰의 id로 리뷰 한 개를 조회한다.
<dto/ReviewReadResponse.java>
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ReviewReadResponse {
private Long id;
private String title;
private String content;
private String userName;
private String hospitalName;
public static ReviewReadResponse fromEntity(Review review) {
ReviewReadResponse response = ReviewReadResponse.builder()
.id(review.getId())
.title(review.getTitle())
.content(review.getContent())
.userName(review.getUserName())
.hospitalName(review.getHospital().getHospitalName())
.build();
return response;
}
}
Java
복사
<service/ReviewService.java>
public Review getReview(Long id) {
// id가 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킨다.
Review review = reviewRepository.findById(id).orElseThrow(() -> new RuntimeException("해당 id가 없습니다."));
return review;
}
Java
복사
<controller/ReviewContoller.java>
@RestController
@RequestMapping("/api/v1/reviews")
@Slf4j
@RequiredArgsConstructor // 필요한 argument를 넣어줌
public class ReviewController {
private final ReviewService reviewService;
@GetMapping("/{id}")
public ResponseEntity<ReviewReadResponse> get(@PathVariable Long id) {
Review review = reviewService.getReview(id);
ReviewReadResponse response = ReviewReadResponse.fromEntity(review);
return ResponseEntity.ok().body(response);
}
}
Java
복사
병원 리뷰 조회
GET /api/v1/hospitals/{hospitalId}/reviews
•
병원 id로 병원 리뷰들을 조회한다.
<repository/ReviewRepository.java>
public interface ReviewRepository extends JpaRepository<Review, Long> {
List<Review> findByHospital(Hospital hospital);
}
Java
복사
<controller/HospitalController.java>
@GetMapping("/{hospitalId}/reviews")
public ResponseEntity<List<ReviewReadResponse>> reviews(@PathVariable Long hospitalId) {
return ResponseEntity.ok().body(reviewService.findAllByHospitalId(hospitalId));
}
Java
복사
<Service/ReviewService.java>
public List<ReviewReadResponse> findAllByHospitalId(Long hospitalId) {
Hospital hospital = hospitalRepository.findById(hospitalId)
.orElseThrow(()-> new IllegalArgumentException("해당 id가 없습니다."));
List<ReviewReadResponse> reviews = reviewRepository.findByHospital(hospital)
.stream().map(review -> ReviewReadResponse.builder()
.title(review.getTitle())
.content(review.getContent())
.userName(review.getUserName())
.hospitalName(review.getHospital().getHospitalName())
.build()
).collect(Collectors.toList());
return reviews;
}
Java
복사
•
map() 메소드는 값을 변환해주는 람다식을 인자로 받아 새로운 데이터를 만들기 위해 사용된다.
병원 정보와 함께 리뷰 조회
GET /api/v1/hospitals/{id}
•
병원을 조회했을 때 리뷰도 조회된다.
<dto/HospitalReadResponse.java>
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class HospitalReadResponse {
private Long id;
private String hospitalName;
private String roadNameAddress;
private List<ReviewReadResponse> reviews;
public static HospitalReadResponse fromEntity(Hospital hospital) {
return HospitalReadResponse.builder()
.id(hospital.getId())
.hospitalName(hospital.getHospitalName())
.roadNameAddress(hospital.getRoadNameAddress())
.reviews(hospital.getReviews().stream()
.map(review->ReviewReadResponse.fromEntity(review))
.collect(Collectors.toList())) // review를 ReviewReadResponse로
.build();
}
}
Java
복사
<service/HospitalService.java>
public Hospital findById(Long id) {
Hospital hospital = hospitalRepository.findById(id).orElseThrow(
()->new IllegalArgumentException("id가 없습니다."));
return hospital;
}
Java
복사
<controller/HospitalController.java>
@GetMapping("/{id}")
public ResponseEntity<HospitalReadResponse> get(@PathVariable Long id) {
Hospital hospital = hospitalService.findById(id);
HospitalReadResponse response = HospitalReadResponse.fromEntity(hospital);
return ResponseEntity.ok().body(response);
}
Java
복사