본문 바로가기

Java7

[자바] HashMap 동작 원리 정리 자바에서 HashMap은 키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 associate array입니다. 연관 배열(associate array) : 키 하나와 값 하나가 연관되어 있으며 키를 통해 연관되는 값을 얻을 수 있는 자료 구조 데이터를 저장할 버킷을 찾는 방법 HashMap은 객체의 hashCode() 메서드의 반환 값을 사용한 hashCode() % BUCKET_SIZE 수식을 사용하여 데이터를 저장/조회를 할 버킷 위치를 계산합니다. 위 수식을 사용하여 데이터를 BUCKET_SIZE 내의 위치에 값을 저장할 수 있게 됩니다. 해시 값 충돌이 발생한다면? 보통 Hash 값 충돌이 발생하면 개방 주소법, 체이닝 기법을 사용하여 충돌을.. 2022. 10. 30.
[Java] BigDecimal, 정확한 실수를 표현하는 방법 최근 개인 프로젝트를 진행하면서 오차가 없어야 하는 실수를 다뤄야 할 일이 있었는데, 무심코 해당 데이터들을 double 타입으로 선언하다가 'double 타입은 오차가 생길 수 있다'라는 문장이 머릿속에 스쳐지나 갔습니다. 이를 계기로 BigDecimal 에 대해 찾아보게 되었고, 기본적인 사용법에 대해 정리하였습니다. BigDecimal이란? 자바에서 실수 타입으로 보통 double형을 많이 사용합니다. 그런데 double형은 정밀도가 최대 13자리이고, 근사치를 저장하기 때문에 오차가 발생하여 크고 정확한 실수가 필요한 경우 예상치 못한 문제가 발생할 수 있습니다. 이런 경우 BigDecimal을 사용하여 정확한 실수 값을 표현할 수 있습니다. BigDecimal 클래스 내부를 살펴보.. 2022. 6. 9.
[프로그래머스] n진수 게임 - 자바(Java), 2018 KAKAO BLIND RECRUITMENT 문제 https://programmers.co.kr/learn/courses/30/lessons/17687 풀이 코드 정수를 특정 진법으로 변환한 문자열을 반환해 주는 convert()메서드를 사용해서 t번째 튜브의 순서가 포함된 숫자까지 구한 후, 튜브가 말해야 되는 순서의 숫자들을 문자열로 만들어 반환한다. public class Solution { public String solution(int n, int t, int m, int p) { StringBuilder sb = new StringBuilder(); //t번째 튜브의 순서 int limit = m*(t-1) + p; int i = 0; //t번째 튜브의 순서가 포함된 숫자까지만 구한다. while(sb.length() < limit) {.. 2022. 1. 12.
[프로그래머스] 땅따먹기 - 자바(Java), DP(Dynamic Programming) 문제 https://programmers.co.kr/learn/courses/30/lessons/12913 풀이 DFS를 사용해 완전 탐색으로 풀이하면 시간 초과로 실패하기 때문에, DP(Dynamic Programming)를 사용하여 풀이해야 한다. import java.util.*; class Solution { int solution(int[][] land) { int n = land.length; for(int i = 1; i < n; i++) { //land[i][j] : i행 j열로 내려왔을 때의 최대 값 land[i][0] += Math.max(land[i-1][1], Math.max(land[i-1][2], land[i-1][3])); land[i][1] += Math.max(land[i-.. 2022. 1. 10.
[프로그래머스] 피보나치 수 - 자바(Java), 메모이제이션 문제 https://programmers.co.kr/learn/courses/30/lessons/12945 풀이 n이 최대 100000이기 때문에 엄청나게 큰 수가 만들어지게 되어 일반적인 피보나치를 계산하는 로직으로는 오버플로우가 발생하게 된다. 그렇기 때문에 fibo[n]%1234567 = (fibo[n-1] + fibo[n-2])%1234567 식을 활용하여 코드를 작성한다. 또한 메모이제이션을 사용하여 시간 초과를 방지한다. import java.util.*; class Solution { int[] fibo; public int solution(int n) { fibo = new int[n+1]; return dfs(n); } private int dfs(int n) { if(fibo[n] > .. 2022. 1. 4.
[프로그래머스] 카펫 - 자바(Java) 문제 https://programmers.co.kr/learn/courses/30/lessons/42842 풀이 코드 public class Main { public int[] solution(int brown, int yellow) { //column, row : 노란 격자 컬럼, 행 길이 for(int column = 1; column yellow/column*2 + column*2 + 4 = (yellow/column + column)*2 + 4 = brown */ if(yellow%column == 0 && ((row+column)*2 + 4) == brown) { return new int[] {row+2, column+2}; } } return null; } } 2022. 1. 3.