결론으로 바로 가기 먼저 이 문제는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 실습하는 과정에서 마주친 상황이다. 책은 몇 년 전에 지어진 기준이라 자바나 스프링부트의 버전이 낮게 되어있다. 그렇지만 그 당시 버전보다는 지금 상황에서 안정된 최신 버전으로 변경사항은 고치며 해보고 싶어 최신버전으로 진행했다. Spring Boot : 3.1.2 Java : 17 Gradle : 8.2.1 (Gradle은 신경 못 썼지만 이거 때문에 문제가 있었다..) 문제 상황 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.projectlombok:lombok' imple..
코딩테스트 연습 - 괄호 회전하기 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다. (), [], {} 는 모두 올바른 괄호 문자열입니다. 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다. 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호..
코딩테스트 연습 - 귤 고르기 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다. 예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기..
변수 코틀린에는 강력한 타입추론(type inference) 기능이 있다. 변수의 타입을 명시해도 되지만, 생략하고 컴파일러가 추론하도록 해도 된다. 코틀린은 불변 변수 val 사용을 권장하고 있다. 불변 변수는 한 번 선언하고 나면 값을 변경할 수 없다. fun main() { var a: String = "first" println(a) a = "sec" println(a) val b: Int = 1 val c = 3 } // 실행 결과 first sec 변이 변수 var a를 선언하면서 초기화를 해주었다. a에 새로운 String 값을 할당할 수 있다. 불변 변수 val를 선언하고 초기화하고, 타입 선언은 생략할 수도 있다. 컴파일러가 3을 보고 Int 타입으로 추론을 한다. fun main() {..
개발을 할 때 유지보수하기 쉽게, 남이 봤을 때 직관적이게, 그렇지만 깔끔하게 구성하려고 노력해 봤다. 컨트롤러에서 어떤 API인지 직관적으로 나타내보자. 우선 api문서를 작성하던 어떤 메서드가 있는지 확인하던 컨트롤러를 가장 먼저 보게 될 것이다. 물론 함수명이나 컨트롤러에 작성된 로직들로만 이게 어떤 역할을 하는 api인지 알면 좋지만 그렇지 못할 수도 있기에 주석을 작성해 봤다. @RestController @RequestMapping("resource") class ResourceController( private val resourceService: ResourceService ) { /** 페이징 API **/ @GetMapping("/list") fun loadPagedResource( @..
중위 함수 Infix Functions 파라미터를 하나만 받는 멤버 함수나 확장(extension) 함수는, 해당 함수를 "중위 함수"형태로 쓸 수 있다. fun main() { infix fun Int.times(str: String) = str.repeat(this) println(2 times "Bye ") val pair = "자바" to "코틀린" println(pair) infix fun String.onto(other: String) = Pair(this, other) val myPair = "자바" onto "코틀린" println(myPair) val a = Person("A") val b = Person("B") a likes b } class Person(val name: String..
코딩테스트 연습 - 멀리뛰기 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한 번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2칸) 의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567을 나눈 나머지를 리턴하는 함수, solution을 완성하..
코딩테스트 연습 - N개의 최소공배수 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요. 제한사항 arr은 길이 1 이상, 15 이하인 배열입니다..