코트카타
43) 크기가 작은 부분 문자열
나의 풀이
import java.util.*;
class Solution {
public int solution(String t, String p) {
int answer = 0;
int start = 0;
int end = p.length();
long pNumber = Long.parseLong(p);
List<Long> values = new ArrayList<>();
while (end<=t.length()){
values.add(Long.parseLong(t.substring(start, end)));
start++;
end++;
}
for (Long v : values) {
if (v <= pNumber){
answer++;
}
}
return answer;
}
}
int로 하니 런타임 에러가 발생했다.
범위에 따른 데이터 타입도 잘 생각해야 되겠다.
다른 분들의 풀이
import java.util.stream.LongStream;
class Solution {
public int solution(String t, String p) {
long targetNumber = Long.parseLong(p);
int targetNumberLength = p.length();
return (int) LongStream.range(0L, t.length() - targetNumberLength + 1L)
.mapToObj(i -> t.substring((int) i, (int) i + targetNumberLength))
.mapToLong(Long::parseLong)
.filter(number -> number <= targetNumber)
.count();
}
}
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/147355/solution_groups?language=java
스트림이 아직 익숙하지 않지만
그래도 다른 분들의 풀이를 보면서 익숙하게 만들고자 한다.
2025.02.12(수)
일정관리 Develop 주석 작성(Javadoc) 및 리팩토링
Javadoc 이용한 주석 작성
지난 번 과제 때 튜터님께서 Javadoc을 이용해서 주석을 작성하는 것을 추천하셔서 아래와 같이 작성해보았다.
예시)
/**
* 회원 생성(회원가입)
* @param name 회원명
* @param email 이메일
* @param password 비밀번호
* encryptPassword : 비밀번호 암호화 후 저장
* @return SingUpResponseDto 회원 생성 응답 DTO 반환
*/
@Transactional
public SingUpResponseDto save(String name, String email, String password) {
String encryptPassword = passwordEncoder.encode(password); //비밀번호 암호화
Member member = new Member(name, email, encryptPassword);
Member savedMember = memberRepository.save(member);
return new SingUpResponseDto(savedMember.getId(),savedMember.getName(),savedMember.getEmail());
}
리팩토링
- 반복적으로 사용되는 부분을 따로 메서드로 분리하기
예시)
* getMemberByIdOrElseThrow : 회원 id로 회원 조회
: 선택 조회, 수정, 삭제 시 필요한 기능이었는데 이를 메서드로 분리했다.
* validateMemberId : 본인(작성자) 검증 로직
: 선택 수정, 삭제 시 작성자인지 검증하는 로직이 필요했는데 이 부분을 메서드로 분리했다.
/**
* 회원 선택 수정(회원명, 이메일 수정)
* @param id 회원 id
* @param name 회원명
* @param email 이메일
* @param loginMember 세션 로그인 멤버
* getMemberByIdOrElseThrow : 회원 id로 회원 조회
* validateMemberId : 본인(작성자) 검증 로직
* @return MemberResponseDto 회원 응답 DTO 반환
*/
@Transactional
public MemberResponseDto updateNameAndEmail(Long id, String name, String email, Member loginMember) {
Member member = getMemberByIdOrElseThrow(id);
validateMemberId(id, loginMember);
member.updateNameAndEmail(name,email);
return new MemberResponseDto(
member.getId(),
member.getName(),
member.getEmail()
);
}
/**
* 회원 id로 회원 조회
* @param id 회원 id
* @exception ApplicationException 해당 id를 찾을 수 없는 경우, 404 예외처리(커스텀 예외처리 ID_NOT_FOUND)
* @return 회원 id에 해당하는 회원 반환
*/
private Member getMemberByIdOrElseThrow(Long id) {
return memberRepository.findById(id).orElseThrow(
() -> new ApplicationException(ErrorMessageCode.NOT_FOUND,
List.of(new ApiError(CustomErrorMessageCode.ID_NOT_FOUND.getStatus(),
CustomErrorMessageCode.ID_NOT_FOUND.getMessage())))
);
}
/**
* 본인(작성자)만 본인(작성자) 검증 로직
* @param id 회원 id
* @param loginMember 세션 로그인 멤버
* loginMember(로그인 정보)의 id와 DB에서 조회한 id 비교
* @exception ApplicationException 각각의 id가 불일치할 경우 403 예외처리(커스텀 예외처리 NOT_OWNER)
*/
private static void validateMemberId(Long id, Member loginMember) {
if (!loginMember.getId().equals(id)){
throw new ApplicationException(ErrorMessageCode.FORBIDDEN,
List.of(new ApiError(CustomErrorMessageCode.NOT_OWNER.getStatus(),
CustomErrorMessageCode.NOT_OWNER.getMessage())));
}
}
다음에 진행할 때에는 Javadoc을 활용해서 미리 주석도 달아두고,
리팩토링하면 좋을 만한 점들을 미리 생각해두면서 작업하면 좋을 것 같다는 교훈을 얻었다.
'CODING > 스파르타 내일배움캠프 TIL' 카테고리의 다른 글
40_삼총사_JPA, 연관관계 실시간 구현 세션_일정관리 Develop 리팩토링_25.2.11(화) (0) | 2025.02.11 |
---|---|
39_이상한 문자 만들기_일정관리 Develop 개인과제 Lv 5,6,7,8 도전과제 구현완료(튜터님 피드백 필요)_25.2.10(월) (0) | 2025.02.10 |
38_3진법 뒤집기_일정관리 Develop 개인과제 Lv 2,3,4 필수과제 구현완료_25.2.7(금) (0) | 2025.02.07 |
37_최대공약수와 최소공배수_일정관리 개인과제 피드백_일정관리 Develop 개인과제 Lv 1, 2 구현중_25.2.6(목) (0) | 2025.02.06 |
일정 관리 앱 Develop 개인과제 관련 트러블슈팅 TIL 모음 (0) | 2025.02.06 |