이번주는 너무 피곤하다...
팀과제진행중에 JPA로 N:M 연관관계 코드 처음짜본거랑 알고리즘 문제 하나 오래걸렸던거를 기록용으로 올리려고한다.
다음 그림과 같이
리뷰와 해시태그는 N:M으로 매핑돼있을때 이 둘을 N:M으로 매핑하는 방법에 대해서 기록해보겠다.
Review Entity
@Getter
@Entity
@Table(name = "review")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Review extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
@Column(nullable = false)
@Length(max = 50)
private String title;
@Column(nullable = false)
@Length(max = 1000)
private String content;
@Column(nullable = false)
private Float ratingScore;
@Column(nullable = false)
@Length(max = 100)
private String movieName;
@OneToMany(mappedBy = "review")
private List<ReviewHashtag> reviewHashtagList = new ArrayList<>();
@Builder
public Review(String title, String content, Float ratingScore, String movieName) {
this.title = title;
this.content = content;
this.ratingScore = ratingScore;
this.movieName = movieName;
}
public void update(String title, String content, Float ratingScore) {
this.title = title;
this.content = content;
this.ratingScore = ratingScore;
}
public void addReviewHashtag(ReviewHashtag reviewHashtag) {
this.reviewHashtagList.add(reviewHashtag);
reviewHashtag.setReview(this);
}
}
Hashtag Entity
@Getter
@Entity
@Table(name="hashtag")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Hashtag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 15)
private String name;
@OneToMany(mappedBy = "hashtag")
private List<ReviewHashtag> reviewHashtagList = new ArrayList<>();
public Hashtag (String name) {
this.name = name;
}
public void addReviewHashtag(ReviewHashtag reviewHashtag) {
this.reviewHashtagList.add(reviewHashtag);
reviewHashtag.setHashtag(this);
}
}
중간 테이블로 사용될 ReviewHashtag Entity
package sparta.ifour.movietalk.domain.reviews.entity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "review_hashtag")
public class ReviewHashtag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "review_id", nullable = false)
private Review review;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "hashtag_id", nullable = false)
private Hashtag hashtag;
public ReviewHashtag(Review review, Hashtag hashtag) {
this.review = review;
this.hashtag = hashtag;
}
public void setReview(Review review) {
this.review = review;
}
public void setHashtag(Hashtag hashtag) {
this.hashtag = hashtag;
}
}
import java.util.HashMap;
import java.util.Map;
class Solution {
public String[] solution(String[] players, String[] callings) {
String[] answer = new String[players.length];
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < players.length; i++) {
map.put(players[i], i);
}
for (String s : callings) {
Integer rank = map.get(s);
if (rank == 0) {
continue;
}
map.put(s, rank - 1);
String before = players[rank - 1];
players[rank] = before;
players[rank-1] = s;
map.put(before, rank);
}
return players;
}
}
이 문제의 가장 중요한 요소는 순서기록용으로 HashMap 타입을 사용하는것이다.
그리고 또 하나 풀때 가장 생각이 막혀있던 부분은 players배열의 순서를 바꿔줘야하는 부분이다.
처음엔 HashMap에 순서를 기록만해놨다가 players배열의 순서를 안바꿔놔서 꽤 시간이 많이 걸렸다.