[Java] 백준 12100 2048(Easy) / G1
·
백준
2048을 구현하여 시뮬레이션 하는 문제이다.총 5번을 이동하여 만들 수 있는 가장 높은 수를 찾으면 된다.문제 해결 전략사실 엄청난 수학적 알고리즘을 요하는 문제는 아니다.얼마나 빠른 시간 내에 정교하게 2048의 움직임을 만들어내고 dfs를 통하여 가장 높은 수를 찾는 문제이다.하지만, 구현이 쉽냐고 하면 절대 아니다.그래서 생각해본 구현 전략은 다음과 같다.2048 메커니즘 구현dfs를 통한 풀이2048 구현2048은 다음과 같이 간단한 규칙을 갖는다움직이고자 하는 방향에 자신과 같은 수를 갖는 타일이 있으면 두 타일이 합쳐지고, 타일은 합쳐지는 두수의 합으로 변한다.그래서 이동하고자 하는 방향에 따라, 각 행과 열의 방향에 맞는 로직을 설정하였다. 예를 들어 위의 그림 처럼, 위 → 오른쪽 이렇게..
[Java] 백준 10942 펠린드롬? / G4
·
백준
기존 펠린드롬 문제를 풀어보았다면 간단히 생각할 수 있는 문제이지만, 처음에는 펠린드롬 수열의 정의를 정확히 몰라서 꽤나 애 먹었었다.펠린드롬이란 간단히 말해서 앞에서부터 읽으나 뒤에서부터 읽으나 동일한 수열이다.어떤 수열에 대해 다음이 성립하면 펠린드롬 수열이라고 한다.즉, 수열의 앞과 뒤가 대칭을 이루며 동일해야 한다.문제 해결 전략문제를 보고 두 가지의 해결 방안을 떠올렸다.1. 순차 탐색시작점과 끝점이 주어지면 stack을 이용하여 순차적으로 탐색하는 방법을 생각했다. 중간 점 이전의 원소들을 stack에 넣고 이후의 원소들이 stack에 있다면 pop 하는 방식을 쉽게 생각해 볼 수 있다.하지만, 질문 set의 갯수가 1,000,000이고 수열의 길이가 2000이니 최대 연산 횟수는 2,000,..
[Java] resource에 있는 파일을 읽어오는 방법
·
Java
Java에서 파일을 읽어오는 방법에 대해 알아보자. 파일을 읽어오기 위해 가장 중요한 것은 파일의 위치를 정확히 지정하는 것이다.예를 들어, 아래와 같은 디렉토리 구조를 가진 프로젝트가 있다고 가정하자.src/ ├─ main/ │ ├─ java/ │ │ ├─ com.example.Main.java │ ├─ resources/ │ ├─ test.txt 여기서 test.txt 파일은 src/main/resources/ 디렉토리 아래에 위치하며,이는 클래스패스(classpath)로 지정된 경로에 포함된다. 정적 리소스 파일을 처리하는 방법 Java에서는 Path 객체를 생성하고 Java NIO API를 이용하여 파일의 내용을 문자열로 읽어올 수 있다.이를 위한 코드는 다음과 같다.pr..
리스트에서 중복 요소를 확인하는 방법
·
Java
1. 이중 반복문 사용하기가장 기본적인 방법은 리스트의 모든 요소를 두 번 탐색하여 중복을 검사하는 방법이다.@Testvoid duplicateTest() { List list = List.of(1, 2, 3, 4, 5, 1); boolean flag = false; for (int i = 0; i 각 요소를 순차적으로 탐색하면서 리스트를 다시 순회하게 된다.이 방법은 읽기에 다소 불편하고, 시간 복잡도가 O(n²)이다. 2. Set을 이용하기현재 목표는 “중복 요소를 확인하자”이다.이중 반복문은 직관적이지만, 시간 복잡도가 높기 때문에 더 빠른 연산을 위해 Set을 이용할 수 있다. Set은 중복된 값을 허용하지 않기 때문에 중복 확인에 적합하다.Set 중에서도 `HashSet`을 이용..
전략 패턴을 사용하여 test에 적용하기
·
Backend
지난 글에 전략 패턴과 DIP를 사용하여 구현하는 법을 알아보았다.오늘은 실제 전략 패턴의 사용 예시와, test를 구현하면 어떤 점이 용이한지 알아보고자 한다. 전략 패턴을 사용하여 구현하기 이 예시에서는 EventFactory안에서 ChristmasDiscountable의 구현체를 ChristmasEvent에 주입한다.ChristmasDiscountable은 ChristmasEvent의 할인 금액 로직을 제공하는 인터페이스이다.EventFactory 안에서 ChristmasDiscountable 인터페이스를 주입한다.주입 과정은 아래와 같다.public class EventFactory { private final ChristmasDiscountable christmasDiscount; ..
일급 컬렉션(first class collection)이 뭘까?
·
Java
본 글은 https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/ 를 참조하여 작성되었습니다. 일급 컬렉션을 사용하는 이유일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언tecoble.techcourse.co.kr 일급 컬렉션이란 무엇일까?말 그대로 일급 컬렉션이 멀까?최근 코드 리뷰를 하면서 새롭게 알게 된 단어이다.익히 들어본 일급 함수(first class function)과 비슷할까 생각했다.일급 함수는 다음과 같은 특징을 갖는다.함수를 변수에 할당할 수 있다...
[Java] 백준 1038 감소하는 수 / G5
·
백준
문제https://www.acmicpc.net/problem/1038문제 해결 전략감소하는 수라 하면은 가장 큰 자릿수부터 가장 작은 자릿수까지 계속 감소하는 수를 의미한다. ex) 987 321 86753 ...이때 9876543210이 가장 큰 감소하는 수임을 알고, long을 사용하기로 하였다.기존 답안처음에는 선형적으로 모든 수를 탐색하면서 감소하는 수를 찾았고, 그 수를 찾을 때 마다 target(count라는 변수 명이 더 적합했을 것 같음)를 하나씩 더해주는 방식으로 찾았다.다만, 이 방식으로 했더니 n이 50000을 넘어가면서 연산시간이 너무 오래 걸리게 되고 tc하나도 제대로 못푸는 문제가 발생했다.답안을 제출하기도 전에 방법을 바꿔야 했다.import java.io.BufferedRea..
[Java] 백준 2473 세 용액 / G3
·
백준
문제https://www.acmicpc.net/problem/2473 문제 해결 전략백준[2470] 두 용액(https://www.acmicpc.net/problem/2470)과 굉장히 유사한 문제다. 기존 두 용액 문제는 합의 절대값이 가장 낮은 두 용액을 선택하는 문제라면, 이 문제는 합의 절대값이 가장 낮은 세 용액을 고르는 것이다. 이 문제도 역시 이중 포인터로 접근할 수 있었다.이중포인터 -> left, right index를 각각 0, array.length-1로 주고 left  다만 이 문제만의 다른 점이 있다면 가장 왼쪽값을 fix하고 left를 (fix한 값 + 1 ), right를 array.length -1 로 하여 이중 포인터로 접근한다는 것이다. fix한 왼쪽 값은 [0,array..