알고리즘 3일
def solution(keyinput, board):
# board[x,y] 각각 -1에 /2 한값이 최대이동가능 거리
# keyinput[up,down,left,right] 각각 result [0,1] [0,-1] ,[-1,0], [1,0]
answer = [0] * 2
height_max = int((board[1] - 1) / 2)
height_min = -int((board[1] - 1) / 2)
width_max = int((board[0] - 1) / 2)
width_min = -int((board[0] - 1) / 2)
for i in range(len(keyinput)):
if keyinput[i] == "up":
if answer[1] == height_max:
answer[1] = height_max
else:
answer[1] += 1
elif keyinput[i] == "down":
if answer[1] == height_min:
answer[1] = height_min
else:
answer[1] -= 1
elif keyinput[i] == "left":
if answer[0] == width_min:
answer[0] = width_min
else:
answer[0] -= 1
elif keyinput[i] == "right":
if answer[0] == width_max:
answer[0] = width_max
else:
answer[0] += 1
return answer
주석에 적은것처럼 구현하려고 했다, 중복을 줄이면 좋겟다 ㅠ
프로그래머스의 다른사람 답변을 참고하여 피드백 해보았다
# --- 다른사람 답안
def solution(keyinput, board):
x_lim,y_lim = board[0]//2,board[1]//2 # // -> 몫만 구함
move = {'left':(-1,0),'right':(1,0),'up':(0,1),'down':(0,-1)} # 딕셔너리 자료형?
x,y = 0,0
for k in keyinput:
# 굳이 range(len()) 안하고 이렇게하면 더 간단하게 할수있을거 같다
dx,dy = move[k]
# dx,dy는 선언없이 사용되는건가?
# https://velog.io/@lio8625/dx-dy-%ED%85%8C%ED%81%AC%EB%8B%89 참고
if abs(x+dx)>x_lim or abs(y+dy)>y_lim:
# abs 절대값 함수 / 높이 너비의 최대 최소값 대신 lim 로 사용하였다
continue
else:
x,y = x+dx,y+dy
return [x,y]
패러다임 불일치문제 , 반복적이고 번거로운 어플리케이션 단에서의 쿼리작업을 줄여주기 위해
ORM(객체 관계 매핑) 기술 등장하게 되었다
JPA,
Java Persistence API
자바 ORM 기술에 대한 표준 명세 이다
아래와 같은 일들을 한다
쿼리를 자동으로 생성
어플리케이션 계층에서 SQL 의존성을 줄여 번거로운 작업 단축
패러다임 불일치 해결
최적화를 통한 성능보장
방언 지원 (h2 Database/ mySQL, oracle .. 등 방언처리해줌)
연관관계 표현 처리
자바 : 객체와 레퍼런스로
데이터베이스 : 테이블사이의 관계(FK)로
=> 이 두방식의 차이를 해결하기 위해 JPA는
"Java 어플리케이션 상에서, 데이터베이스의 연관관계를 표현해주기 위한 장치를 가진다"
JAP가 제공하는 연관관계는 결국 DB의 연관관계를 표현하기 위함이다 따라서
먼저 DB의 연관관계를 이해해야함, DB의 연관관계는 비즈니스 요구사항에 맞춰 이루어짐
JPA 의 경우는 Enitity 클래스의 필드 위에 "연관관계 어노테이션 (@)" 을 설정해 주는 것만으로 연관관계가 형성
/ 예시 JPA 코드 구현을 해보앗다
데이터의 생성(created_at), 수정(last_modified_at) 시간 상속통해 관리
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Timestamped {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column
private LocalDateTime modifiedAt;
}
앞으로 엔티티를 만들때 위와 같은 객체를 만들어두고,
@Entity // 게시글
public class Post extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false, unique = true)
private String content;
}
위와 같이 “extends Timestamped”로 해당 객체를 상속받는다면
상속받는 엔티티 객체들은 항상 아래와 같은 칼럼들을 가지고 있게 됩니다
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column
private LocalDateTime modifiedAt;
상속받는 객체들은 자동으로 생성, 수정시간을 데이터베이스에 입력하고, 필요하다면 해당값을 편하게 Get 할수 있게된다!
Spring Data JPA 는?
JPA 를 편리하게 사용하기 위해, 스프링에서 JPA 를 Wrapping 한 dependency
스프링 개발자들이 JPA 를 사용할 때 필수적으로 생성해야 하나, 예상 가능하고 반복적인 코드들 → Spring Data JPA 가 대신 작성
Repostiory 인터페이스만 작성하면, 필요한 구현은 스프링이 대신 알아서 척척!
예시)
상품 Enitity 선언
@Entity
public class Product extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Long userId;
private String title;
private String image;
private String link;
private int lprice;
private int myprice;
}
-> 상품 Repository 생성
public interface ProductRepository extends JpaRepository<Product, Long> {
}
-> ID 외의 필드에 대한 추가 기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신해준다
public interface ProductRepository extends JpaRepository<Product, Long> {
// (1) 회원 ID 로 등록된 상품들 조회
List<Product> findAllByUserId(Long userId);
// (2) 상품명이 title 인 관심상품 1개 조회
Product findByTitle(String title);
// (3) 상품명에 word 가 포함된 모든 상품들 조회
List<Product> findAllByTitleContaining(String word);
// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}
어떻게??
//Spring Data JPA) 기본 제공해 주는 기능//
// 1. 상품 생성 + .save() 하나의 객체만 저장할때 사용 / .saveAll() 전체저장?
Product product = new Product(...);
productRepository.save(product);
// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();
// 3. 상품 전체 개수 조회
long count = productRepository.count();
// 4. 상품 삭제
productRepository.delete(product);
와우 JPA에 대해서 정리를 너무 잘해주셨어요! 최고입니다! ㅎㅎ
진도를 잘 따라와 주시고 계신것같아 아주 기쁩니다.
혹시나 막히시는 부분이 생기면 튜터에게 와서 질문 주세요 :)
앞으로도 계속 화이팅입니다!