코딩테스트/Java 109

(프로그래머스) 다단계 칫솔

위처럼 자식노드에서 수익이 발생시, 부모노드에게 자기의 이익을 나눠주는 방식이다. 따라서 처음에는 graph방식으로 구현을 하려다가, 각각의 노드의 이름이 String형식으로 제시되었으니 Map을 이용해서 Key(이름)에 따른 Value(수익)으로 구현하였다. 단, 각각의 노드에 대하여 부모-자식 관계일 필요 없이 부모가 있으면 재귀를 호출하게 되는 방식이면 충분했다. 따라서, enroll_refer 이라는 HashMap을 구현하여 자식노드에 대하여 부모를 참조할 수 있게 했다. import java.util.HashMap; class Solution { static HashMap hm = new HashMap(); static HashMap enroll_refer = new HashMap(); publ..

(프로그래머스) 행렬 테두리 회전하기

이전에 백준에서 풀었던 미세먼지안녕!문제와 비슷한 원리이다. 2021.05.24 - [분류 전체보기] - [JAVA] 백준 미세먼지 안녕! [JAVA] 백준 미세먼지 안녕! 구현에 관한 문제이다. 완전탐색 방식으로 구현하였다. 아래 예시는 확산+클리너를 1회 작동하였을때 예시이다. import java.util.*; import java.io.*; class Main { static int Row, Col, T; static int[][].. skmouse.tistory.com 필자는 주로 회전을 시킬때 Queue에 담아서 FIFO방식을 이용하여 회전한다. swap보다는 위 방식이 편하다고 생각한다. 하지만 swap방식도 연습해야 할 필요성을 느낀다. import java.io.*; import java..

(프로그래머스) 로또의 최고순위와 최저 순위

https://programmers.co.kr/learn/courses/30/lessons/77484 해시로 푸는 문제이다. 탐색알고리즘중에서 해시 알고리즘이 빠르다. 해시함수를 이용해서 탐색하면 시간이 알고리즘 수행시간이 입력 데이터 수와 관계없이 일정하다. 다른 탐색을 하기위해 정렬 비용과 탐색비용을 합치면 효율성이 떨어진다. 따라서 해시를 이용한 탐색을 하는 습관을 들여야한다. 필자의 답 import java.util.*; class Solution { static int[] answer = new int[2]; public int[] solution(int[] lottos, int[] win_nums) { HashMap hm = new HashMap(); int zeroCount=0; for(in..

[JAVA] 백준 원판 돌리기

탐색+구현 문제이다. 탐색 방식은 BFS방식으로 Queue에 넣어서 방향을 검사하는 것이다. 좌표값을 Queue에 넣는 방식을 새로 소개하겠다. Queue q = new LinkedList(); q.add(new int[]{i, j, map[i][j]}); 위의 코드처럼 Queue의 자료형에 배열을 넣어주면 임의의 배열을 통째로 넣을 수 있다. 따라서 위에서는 int[] = (x, y, 비교할 해당값) 을 큐에 넣어준 것이다. 그럼 위와 같은것을 언제 사용하는가? => 이중for문을 통해서 map을 한번 다 탐색하고 나서 다시 또 그 값을 찾아가야할때. 문제의 remove를 할때 탐색을 해서 bfs나 dfs를 통해 이웃하는 숫자의 값을 지워야한다. 백트래킹 방식으로 끝부분부터 지워야 탐색을하는데 지장이 ..

[JAVA] 백준 톱니바퀴

구현문제이다. 실수한점 : input값을 받을때, 띄어쓰기가 되어있지 않기 때문에 StringTokenizer로 끊어서 값을 받을수 없는데 인지하지 못하여 조금 헤맸다. Circular Queue가 먼저 생각이 났다. 하지만 Queue를 직접 Push, POP을 이용하는 경우에는 비효율적일거라고 생각했다. 그래서 배열값을 넣어두고 각 위치에 해당하는 주소값을 뜻하는 index를 정하였다. 아래는 Circular Queue를 포인터처럼 표현 식이다. 생성자는 input값으로 받은 value값을 받아낸다. class Circular { int right = 2;//3시방향 int left = 6;//9시방향 int[] states = new int[8]; Circular(int[] states) { for ..

[JAVA] 백준 스타트택시

dfs방식으로 문제를 풀었는데 시간초과가 됐다. 더보기 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; class Main { static boolean[][] visit; static int[][] grid; static int N, M, fuel; static int taxiX, taxiY; static Guest[] guests; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(Sy..

[JAVA] 백준 청소년 상어

처음에 시도했던 코드는 아래와같다. 더보기 더보기 처음엔 시도하던 코드 import java.io.*; import java.lang.reflect.Array; import java.util.*; class Main { static int sharkX, sharkY, sharkD; static int eaten = 0; static int[][] a = new int[4][4]; static int[][] dir = new int[4][4]; static int[] dirx = {0, 0, -1, -1, -1, 0, 1, 1, 1};//index=0일때는 0,0 static int[] diry = {0, -1, -1, 0, 1, 1, 1, 0, -1}; static Stack eatenList = new..

[Java] 백준13263 나무자르기

플레문제인데 이분의 c코드를 참고하여 java로 변환해보았다. https://kibbomi.tistory.com/155 boj, 백준) 13263. 나무자르기 , Convex hull trick ( C / C++) kibbomi.tistory.com 아래와같다. import java.io.*; import java.util.*; class Main { static int n; static int[] a = new int[100001]; static int[] b = new int[100001]; static long[] dp = new long[100001]; static ArrayList s = new ArrayList(); public static void main(String[] args) thro..

비트마스크(Bitmask) : 이진법 이용

이진법을 이용하여 bit연산을 통해 순열조합 과 같은 것을 구할 수 있다. 그렇다면 비트마스크를 사용하는 이유는 무엇일까? DP나 순열 등 배열 활용만으로 해결할 수 없는 문제 작은 메모리와 빠른 수행시간으로 해결이 가능(원소수가 적을 때만) 집합을 배열의 인덱스로 표현할 수 있음 우선, 이진법을 통해, 2진수에서 특정위치의 숫자가 1인지 0인지를 확인하는 방법을 알아보자. 예시 : 집합[1,2,3,4]에 대한 부분집합을 이진수로 표현 [1,2,3,4] -> 1111 [1,3,4] -> 1011 [1,2] -> 1100 [4] -> 0001 [] -> 0000 위와 같다. Java의 Integer에서 bitCount(숫자) 로 2진수로 표현했을때 1의 개수를 세는 메소드가 있다. 아래는 Integer.b..

[JAVA] 백준 드래곤 커브

문제의 핵심은 두가지이다. 커브의 규칙성을 알아내서 구현하는 방법 세대에 도달하기까지 반복하기. 2번을 이해하지 못했다. Input값에는 x,y,d,g가 있는데 여기서 입력받는 g가 어떤용도로 사용되는지 명확한 느낌이 안들었다. 처음에 필자는 Input으로 주어진것은 좌표위에 일부 드래곤 커브만 주어진거라고 생각했다. 하지만, 여기서 주어진 g의 의미는 아래와 같다. x,y좌표에서 시작하는 방향(d)로 주어진다. 위의 값은 0세대이다. 따라서 0세대에서 주어진 g세대까지 확장시켜나가라는 뜻이다. 예제 1 3 3 3 0 1 4 2 1 3 4 2 2 1 import java.io.*; import java.util.ArrayList; import java.util.LinkedList; import java...