소수 만들기
문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.제한사항
nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
주어진 배열에서 3개를 골라 소수가 되는지 확인하는 문제이다.
간단하게 3중 반복문으로 모든 경우의 수의 합을 다시 1부터 나눠가며 소수인지 아닌지 확인하고 count를 늘려갔다.
시간복잡도를 줄여보자는 얕은 꾀로 prime 배열을 만들어 이미 확인된 소수를 추가해놓고, 세 숫자의 합이 이에 속하면 검증없이 바로 +=1 하도록 진행했다.
하.지.만. 문제를 잘 읽었어야지. 소수의 숫자가 아니라 소수가 되는 경우의 개수였다..!
취소하고 얌전히 count 세니 성공!
격차가 엄청난 걸 보니 데이터가 많거나 상당히 비효율 적인 구간이 있긴 한가보다..
오늘은 어제 작성한 Service 가 제대로 작동하는지 확인하기 위해 데이터베이스 연동을 확인하였다.
팀원분께서 supabase 연결을 위한 설정이 담긴 yml 파일을 공유해주셨기 때문에 바로 사용할 수도 있었지만 그렇게 하면 테스트 하는 동안의 데이터가 계속 잔류하게되고 ( 오염 ) 또 다른 팀원과 동시에 작업 시 데이터가 충돌이 날 수도 있기 때문에 H2 콘솔을 이용해 테스트를 하기로 했다.
H2 콘솔을 연결하기 위해선 우선 gradle 에 의존성 추가가 필요하다
//build.gradle.kts 의 depencies 에 H2 database 의존성 추가
implementation("com.h2database:h2")
이후 어플리케이션을 실행하고 resources > application.yml 파일을 생성하여 아래 코드를 작성한다.
spring: datasource: driver-class-name: org.h2.Driver // 사용할 JDBC 드라이버의 클래스 이름을 지정 url: jdbc:h2:mem:jang-labs // jang-labs는 내가 사용할 DB 명을 지어주는 것 h2: console: enabled: true // H2 콘솔 사용 여부. true로 해놔야 SQL 명령어 테스트가 가능하다.
JDBC URL 이 비어있다면 당황하지 말고 위의 url 항목에서 복붙해오자 !
연결에 성공하면 아래 화면처럼 각 테이블을 확인하며 콘솔을 이용할 수 있다.
재실행할 때 마다 DB는 초기화되니 매번 추가해주어야 하는 번거로움이 있긴 하지만 이전 테스트의 결과가 영향을 미치지 않아 오히려 편리하기도 하다.
두 번째 이슈로는 Validation 적용 이 있었다.
CRUD 예외처리를 위해 @RestControllerAdvice 클래스에 각 Handler를 추가하고 throw 를 열심히 작성하던 중, 다른 팀원분의 코드에서 신기한 어노테이션이 사용된 것을 보았다.
@NoBlank ( message = "Name은 필수 입력 정보 입니다") val Name : String @Min(1) @Max(5) var Score : Int
신기해서 찾아보니 이는 자바에서 주로 매개변수 등의 유효성 검사에 사용되는 @Valid 어노테이션으로, Spring 프레임워크에서는 주로 컨트롤러의 메소드 매개변수에 사용되어 요청이나 입력 값의 유효성을 검사하도록 하는데 많이 활용된다고 한다.
@PostMapping fun createFeed( @Valid @RequestBody feedCreateRequest: FeedCreateRequest ): ResponseEntity<FeedResponse> { return feedService.createFeed(feedCreateRequest) .let { ResponseEntity .status(HttpStatus.OK) .body(it) } }
@RequestBody 어노테이션의 앞에 붙여 유효성을 검증하는데 처음엔 제대로 되지 않아 원인을 찾다보니 두 가지 문제점이 있었다.
@field : NoBlank ( message = "Name은 필수 입력 정보 입니다") val Name : String @field : Min(1) @Max(5) var Score : Int
implementation("org.springframework.boot:spring-boot-starter-validation")
특히 2번의 경우 의존성 없이 사용해도 에러표시가 나지 않아 생각지 못했던 원인이라 당황스러웠다. ( 기본 기능처럼 해놓구서는 .. )
덕분에 기본적인 공백 예외처리는 성공했고, 그 외 세부 규칙들은 입력값 예외를 만들어 새로 추가할 예정이다.
기본기능만 구현한 프로젝트라 뚝딱 끝날 줄 알았는데 다른 팀원들과 함께 개발을 하다보니 내가 사용하던 방식과 다른 방식을 사용해보게 되고, 새로운 것을 사용해보고 배우게 될 수 있어 좋은 경험이 되는 것 같다. 내일까지 계획했던 기능을 빨리 마치고 추가 기능도 공부해보는 시간을 만들 수 있으면 좋겠다.