분류 전체보기 744

[Lv.2 / 프로그래머스 / SQL] 업그레이드 된 아이템 구하기

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 a 아이템의 parent_item 이 null이 아닌 b 인 경우, b의 Rarity가 RARE인 것을 출력하면 된다. 서브쿼리를 활용하여 해결했다. SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY FROM ITEM_INFO AS INFO, ITEM_TREE AS TREE WHERE INFO.ITEM_ID = TREE.ITEM_ID AND (SELECT DISTINCT RARITY FROM ITEM_INFO AS INFO2, ITEM_TREE AS TREE2 WHE..

[Effective Java : Item 60] 정확한 답이 필요하다면 float와 double은 피하라

개요 float와 double은 부동소수점 숫자를 표현되는 데 사용되는 데이터 형식으로, 넓은 범위의 수를 '근사치'로 빠르게 계산할 수 있다. 부동 소수점 형식은 유한한 비트 수로 실수를 표현하는데, 이로 인해 정밀도 손실이 발생하기 때문이다. 따라서 아주 정확한 계산이 필요한 금융 관련 계산에는 절대 사용하면 안 된다. 다음의 예제를 살펴보자. System.out.println("1.03 - 0.42 = " + (1.03 - 0.42)); 1.03 달러에서 42센트를 사용한 예제이다. 이를 실행하면 다음과 같은 결과를 얻는다. 기대한 값인 0.61이 아닌 0.6100000000000001 을 출력한다. 심지어 특수한 사례도 아니다. 좀 더 구체적인 사례로 살펴보자. double funds = 1.00..

Backend/Java 2024.03.21

[Effective Java : Item 59] 라이브러리를 익히고 사용하라

개요 static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 위 코드는 0부터 n보다 작은 정수 중 하나를 출력하는 간단한 메서드이다. 괜찮은 듯 보이지만 세 가지 문제점을 내포하고 있다. 1. n이 그리 크지 않은 2의 제곱수라면 같은 수열이 반복된다. 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n값이 크면 현상이 더 두드러진다. 3. 지정한 범위 바깥의 수가 종종 튀어나올 수 있다. rnd.nextInt()는 Integer.MIN_VALUE 를 반환할 수 있는데, 이를 Math.abs()로 절대값으로 반환하고자 하면 오버플로우가 발생하기 때문이다...

Backend/Java 2024.03.20

[Lv.2 / 프로그래머스 / SQL] ROOT 아이템 구하기

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 PARENT_ITEM_ID 가 Null인 항목을 출력해야 한다. IS NULL 구문을 통해 현재 필드의 null 여부를 반환받을 수 있다. SELECT INFO.ITEM_ID, INFO.ITEM_NAME FROM ITEM_INFO AS INFO, ITEM_TREE AS TREE WHERE INFO.ITEM_ID = TREE.ITEM_ID AND TREE.PARENT_ITEM_ID IS NULL

[Lv.2 / 프로그래머스 / SQL] 조건에 맞는 아이템들의 가격의 총합 구하기

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 희귀도가 LEGEND인 아이템의 PRICE 합을 구해야 한다. SELECT SUM(PRICE) AS TOTAL_PRICE FROM ITEM_INFO WHERE RARITY = 'LEGEND'

[Effective Java : Item 58] 전통적인 for 문보다는 for-each 문을 사용하라

for 문 // for 문으로 컬렉션 순회 for (Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); ... // 부수적인 동작 } // for 문으로 배열 순회 for (int i = 0; i < a.length; i++) { ... // 부수적인 동작 } 위 코드는 for 문으로 컬렉션과 배열을 순회하는 코드이다. 이러한 순회 방식은 while 보다는 낫지만, 몇 가지 단점이 존재한다. 단점 1. 가독성 반복자와 인덱스 변수는 가독성을 해친다. 또한 원소만 필요한 경우 원소 반환 목적 외에는 의미가 없는 코드이다. 2. 휴먼 에러 반복자와 인덱스가 많은 빈도로 등장하여 변수를 잘못 사용할 가능성이 높아진다. 또한 컴파일러가 잘못 사용..

Backend/Java 2024.03.18

[Lv.4 / 프로그래머스 / SQL] FrontEnd 개발자 찾기

풀이 SKILLCODES에 있는 스킬 중 Front End 스킬을 가진 개발자를 출력해야 한다. 이전 문제에서 SKILLCODES에 있는 CODE를 적절하게 서브쿼리로 구해, DEVELOPERS에 있는 SKILL_CODE 를 & 비트 연산을 사용해 비교하여 정답을 구했다. 마찬가지로, 이번에는 Front End 카테고리에 속한 스킬들을 모두 추출하여 비교하면 되므로 Front End인 것만 추출하여 CODE를 더해 비트연산을 하면 된다. SELECT DISTINCT ID, EMAIL, FIRST_NAME, LAST_NAME FROM DEVELOPERS AS D WHERE D.SKILL_CODE & ( SELECT SUM(`CODE`) FROM SKILLCODES WHERE CATEGORY = 'Front..

[Effective Java : Item 55] 옵셔널 반환은 신중히 하라

개요 자바 8 이전, 즉 Optional이 존재하기 이전에는 메서드가 특정 조건에서 값을 반환하지 못할 때 취할 수 있는 두 가지 선택지가 있었다. 하지만 각각 가지고 있는 허점이 존재했다. 1. 예외를 던진다. 예외는 되도록 진짜 예외인 상황에서만 사용해야 하고, 예외가 발생할 때 스택 추적 전체를 캡쳐하므로 다소 비용이 크다. 2. null을 반환한다. 별도의 null 처리를 해야 한다. 그렇지 않다면 언젠가 null이 발생한 근원지와는 상관없는 곳에서 NullPointException이 발생할 것이다. 위같은 문제를 해결하기 위해 Optional이 등장했다. Optional Optional는 null이 아닌 T 타입 참조를 하나 담거나, 아무것도 담지 않을 수 있다. 또한 Optional는 위와 같..

Backend/Java 2024.03.14

[Effective Java : Item 51] 메서드 시그니처를 신중히 설계하라

개요 메서드 시그니처란, 메서드의 이름과 매개변수 타입 리스트의 조합을 말한다. 이름이 같은 메서드라도 매개변수 리스트의 타입 순서나 구성이 다르다면 서로 다른 메서드 시그니처로 판단된다. 아이템 51에서는 메서드 시그니처와 관련된 API 설계 요령들을 간략하게 모아 소개한다. API 설계 요령 메서드 이름을 신중히 짓자(아이템 68). - 항상 표준 명명 규칙을 따라야 한다. - 같은 패키지에 속한 다른 이름들과 일관되게 지어야 한다. - 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자. - 너무 긴 이름은 피하자. - 어렵다면 자바 라이브러리 API 가이드를 참조해도 좋다. 편의 메서드를 너무 많이 만들지 말자. - 메서드가 너무 많은 클래스 및 인터페이스는 익히고, 사용하고, 문서화하고, 테스..

Backend/Java 2024.03.12

[Lv.2 / 프로그래머스 / SQL] 조건에 맞는 개발자 찾기

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 DEVELOPERS 테이블에 있는 개발자의 SKILL_CODE가 SKILLCODES 테이블의 C#, Python 코드 중 하나를 포함하는 ROW를 출력해야 한다. 비트연산자를 활용하여 개발자의 SKILL_CODE에 C# 혹은 Python의 CODE가 포함되는지 판별하도록 하자. SELECT DISTINCT ID, EMAIL, FIRST_NAME, LAST_NAME FROM DEVELOPERS AS D WHERE D.SKILL_CODE & (SELECT `CODE` FROM SKILLCODES WHERE ..

반응형