//////
Search
📓

11/25 회고록

생성일
2022/11/27 14:18
태그

김기헌

김상호

이가현

알고리즘

최대공약수
// 두수 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
복사

임학준

조국현

최아영

알고리즘

최대공약수 성질
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
복사