세자리 정수에서의 한수는 알겠는데 두자리 그리고 한자리의 정수들도 한수일까 하는 의문이 들었다.2번 예제에서 1이 입력되었다. 이는 1보다 크거나 같고, 1보다 작거나 같은 즉 1이 한수로 인정되는지를 알려준다. 이때 한수의 개수가 1개이므로 1은 한수이다.때문에 한자
공백 없는 문자를 문자열로 나눌때는 split("")을 사용해서 문자열에 저장해주어야 한다.없이 깔끔한 코드라고 생각한다^ㅁ^
이전에 풀었던 숫자의 합(11720번) 문제처럼 주어진 단어 S를 split("")을 사용해서 문자열 sChar\[]로 저장해준다.그리고 소문자 알파벳 'a'부터 'z'까지 저장되어 있는 문자열 arr\[]을 만들어준다.이중 for문을 이용해서 arr\[]와 sChar

올해 상반기 안에 Sliver Ⅰ 달성하자
테스트 케이스의 개수 T번만큼 루프가 돌아가도록 첫번째 for문을 설정하고 문자열 input을 한줄로 받는다. StringTokenizer을 이용하여 공백을 기준으로 반복 횟수 R과 문자열 S를 나눈다. charAt을 이용해서 한글자씩 반복해서 R번 출력하면 끝!
간단히 띄어쓰기로 구분된 단어의 개수를 구하면 되는 문제이므로 StringTokenizer를 이용해서 문자열 str를 " "를 기준으로 나눈다.처음에는 for문에서 nextToken()을 한 횟수만큼 count++를 하려고 했는데 더 간단한 방법이 있었다. countT
StringTokenizer를 이용해서 받은 문자열을 두 수로 나누고 백의 자리 숫자는 일의 자리로, 십의 자리 숫자는 그대로, 일의 자리 숫자는 백의 자리로 바뀌도록 newA, newB를 지정해준다. 두 수 중 큰 수를 출력하면 끝!
n이 생성자인 d(n)은 n이 한 자리 수일때는 n + n, 두 자리 수일때는 n + (n / 10) + (n % 10)과 같이 반복이 된다. 자리 수에 따른 index 값을 구한 뒤 생성되는 수의 자리에 0을 넣도록 했다.처음엔 문제를 어떻게 해결해야 될지 도저히 모
문제 자체는 간단하다.그러나..문제의 범위를 보지 않고 자연스럽게 세 수를 int형으로 받았다. 자꾸 런타임 에러가 떠서 BufferedReader와 BufferedWriter를 사용해서인줄 알았는데 그럼에도 해결되지 않아 검색을 해보니 범위가 1부터 10의 12제곱까
1부터 N까지의 바구니에 각각의 수를 넣고 i부터 j까지 바구니를 역순으로 M번 정렬한다.바구니 arr를 만들고 i와 j를 입력 받는다. 예를 들어 1, 2, 3, 4를 역순 정렬할때 1과 4를 바꾸고 2와 3을 바꾸면 된다. 즉, i와 j를 바꾸고 i + 1과 j -
처음에 생각했던 로직은 알파벳 A부터 Z까지 들어있는 char 배열을 만든 후 입력받은 문자열 str과 하나하나 비교하여 같으면 같은 인덱스의 int 배열에 ++을 하려고 했다.하지만 이 방법이 복잡한 것 같아 이중 for문을 이용해 ch\[i]와 ch\[j]가 같으면
문자열 str을 받아 char형 배열 ch에 한 글자씩 넣고 for문을 이용해서 ch\[i]와 ch\[ch.length - i - 1]이 같은지 비교한다. 같으면 true, 다르면 false를 반환한다.한 글자가 입력될때는 0이 출력되어 따로 if문에서 문자열의 길이가
숫자 한 칸에 1초씩 걸리므로 1을 걸려면 2초, 2를 걸려면 3초가 필요하다. switch-case 문을 써서 받은 문자마다 걸린 시간을 더했다.
일단 입력의 개수가 주어진게 아니므로 입력이 종료되면 종료가 되도록 해야한다. 앞에서 풀었던 문제에서 더 이상 입력이 없을 경우 입력 받는 것을 종료하는 방법으로 BufferedReader를 선언하고 while((str = bfr.readLine()) != null)가
처음에 이해한 방법은 2 \* N - 1번째 줄까지 출력하는 첫번째 for문을 작성하고 안에 세 개의 for문을 넣었다. 즉, 그림과 같이 공백 별 공백으로 이루어졌다고 생각했는데 다음과 같은 에러가 떴다. 찾아보니 정답과 출력은 같으나 공백 혹은 빈 줄이 출력될때
간단한 문제라고 생각했다. for문을 이용해서 20줄을 입력 받아 과목명 학점 과목평점을 StringTokenizer를 이용해서 구한 뒤 계산하면 되기 때문이다.등급이 P인 과목은 계산에서 제외해야 함을 분명히 생각하고 문제를 풀었다. 그러나..switch-case문에
크기가 N x M인 2차원 배열 A, B를 이중 for문을 이용해서 입력 받은 값을 넣어준 뒤 크기가 같은 2차원 배열 newArr에 더한 값을 넣으면 끝!
9 x 9 크기의 int형 2차원 배열을 만든 뒤 이중 for문을 이용해서 값을 넣어준 뒤 if문에서 가장 큰 값을 찾고 그 인덱스를 반환하면 된다. 그러나..쉬운 문제라고 생각하고 문제를 대충 읽고 풀었더니 90%대에서 틀렸다고 떴다. 문제의 조건에서 주어지는 수는
11382번 꼬마정민이 문제에서는 long 타입을 써야하는 걸 int형으로 써서 틀렸던 기억이 나서 이번엔 범위를 자세히 보고 푸려했다.long의 최댓값을 찾아보니 9223372036854775807이라고 하는데 예제는 9223372036854775807와 922337
아주 간단한 문제다. 단어 S와 정수 i를 입력받은 뒤, S를 split("")으로 한 문자씩 나눈 뒤 i번째 문자를 출력하면 된다.
정말 오래걸렸던 문제다. 문제는 이해했지만 도저히 로직을 어떻게 짜야할지 모르겠어서 다른 문제를 먼저 풀면서 미뤘던🙄 문제인데 처음 접근법이 잘못됐던 것 같다. 처음에는 M번 i, j, k를 받고 그 안의 for문에서 i부터 j까지 돌렸는데 이렇게하면 바구니의 인덱스
문제의 설명이 매우 구구절절인데🤨 요약하자면 한 마디로 2차원 배열 문자열을 받고 그 배열을 세로로 한 열씩 읽으라는 말이다. 이때 그 값이 비어있으면 건너뛰고 다음 행의 같은 열의 값을 출력하면 된다. 다만 다섯줄을 입력 받는다고 나와있지만 입력 받을 문자의 길이는
10810번 공 넣기 문제와 비슷하지만 다른 점은 주머니의 숫자와 같은 공이 하나씩 들어있는 것이다. int tmp를 선언하여 arr[i]와 arr[j]의 공을 바꾸는 중간 매개체 역할을 하도록 한다.
두 수가 0이면 for문을 종료하도록 하였고 자연수가 입력되므로 a를 b로 나눴을때 나머지가 0, b를 a로 나눴을때 나머지가 0, 둘 다 아닐때 세 조건으로 나눠서 문제를 풀었다.
처음엔 자연스럽게 약수들만 모아둔 배열을 만들고 그 안에서 K번째로 작은 수를 구하려고 했으나 쉽지 않아 아예 다른 로직을 생각했다.1부터 N까지, N을 나눴을때 나누어 떨어지는 수가 나올때마다 count를 했으며 이 count가 K와 같을때 그때의 약수를 출력했으며
소수가 무엇인지 이해하면 풀기 쉬운 문제다. 소수란 1과 자기 자신 말고는 약수가 없는 수다. 예를 들면 3, 5, 7이 있는데 이때 1은 소수에 해당하지 않는다. 그래서 예제에서 소수의 개수가 3인 것이다.소수인지 아닌지 판별하기 위한 boolean형 변수 decim
1978번 소수 찾기 문제처럼 소수에 대해 이해만 하면 쉽게 풀 수 있다.소수를 구하는 부분은 소수 찾기 문제와 동일하게 구성하고 소수일때마다 sum에 값을 더하고 min은 10000으로 초기값을 설정하여 처음 구해진 소수가 min에 저장되도록 하면 될 것이라고 생각했
소인수분해는 1이 아닌 약수로 수를 끝까지 나누는 것이므로 for문 보다는 while문을 쓰는 것이 적합하다고 생각했다. 나눌 수인 int형 변수 i를 2로 선언한 뒤, i가 N이 될때까지만 while문을 돌리며 만약 N이 i로 나누어 떨어지면 즉시 출력하고 N은 i로
0층의 i호에는 i명만큼 살기 때문에 따로 넣어주고 i층의 j호에는 i-1층 1호부터 j호까지 들어가도록 삼중 for문을 돌렸다. 입력받은 층과 호의 사람을 출력하면 완료!시간 제한이 적었다면 풀지 못했을 문제인 것 같다. 혹시 반복문 말고 다른 방법으로 접근할 수 있
문제를 요약하자면, 온 손님 순서대로 101, 201, 301 .. h01(이때 h는 호텔 층 수), 102, 202 .. h02 .. hw(이때 w는 각 층의 방 수) 순으로 배정하란 뜻이다.이 문제에서 w는 중요하지 않다고 생각했다. 왜냐하면 어차피 예제는 w에 벗
처음에는 for문을 돌려 A와 B를 포함한 수들을 합하는 로직으로 풀었으나 당연하게도 시간초과로 틀렸다😅가우스의 덧셈 알고리즘을 활용해야 함을 (찾아서..) 깨달았고 주어진 수의 개수가 짝수일때, 홀수일때를 나눠서 조건을 설정해주었다.예를 들어, 1과 5가 주어졌을땐
직사각형의 꼭짓점들은 (0, 0), (w, 0), (0, h), (w, h)이므로 직사각형의 경계선까지 가는 거리의 최솟값은 x의 길이, y의 길이, |x - w], |y - h| 중 하나다. 이들을 배열에 넣어 for문을 이용해서 가장 작은 값을 구했다. 이때 min
이 문제는 크로아티아 알파벳 뿐만 아니라 크로아티아 알파벳에 해당하지 않는 알파벳들도 세야 한다. 표의 크로아티아 알파벳을 넣은 문자열 배열을 만드는데 이때 세자리를 필요로 하는 dz=는 따로 뺐다. dz= 때문에 그동안 애를 먹었기 때문에 else if문 조건으로 따
네 번째 점은 3개 중 다른 값이 되는 것을 알았다. 4행 2열 크기의 int형 배열에 3개 점의 값들을 넣고 if문을 이용해서 그 중 다른 값을 출력하도록 했다.단순히 if문을 사용해서 값을 구했는데 더 깔끔하게 코드를 짤 수 있을까?
예를 들어, A, B, V가 각각 2, 1, 5일때를 생각해보았다.4일째 되는 낮에 5미터에 도달하기 때문에 4일째에는 내려가지 않는다.이것을 식으로 나타내면 (A - B) \* (day - 1) + A = V가 된다. 즉, day = (V - A) / (A - B)
💻 문제 일단 이해하자🤔
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열은 중복이 아닌 조합이다.\[Java] 프로그래머스 1단계: 소수 만들기에서 주어진 숫자 중 3개를 뽑아 더하는 것을 구현한 로직이 있었는데 오늘 라이브 강의를 들으며 그 부분이 나왔다!for문을 이용한다면 위와
N명의 사람 중 K번째 사람을 제거하고 제거한 이후의 K번재 사람을 제거하는 과정이 반복되므로 Queue를 사용하는 것이 용이하다고 생각했다. K-1번째 사람은 enQueue 한 뒤, deQueue하고 K번째 사람은 제거하는 과정을 반복했다.문제 아래의 알고리즘 분류를
업로드중..생각보다 오래 걸렸던 문제다. 문제를 이해하는데도 오래걸려 정확히 이해하지 못하고 넘어갔던 것 같아 다시 풀어보았다.재귀 문제를 풀때 파악해야 할 것은 반복될 부분, 반복이 종료될 조건, 반복되면서 바뀔 부분이다.이 문제에서 반복될 부분은 "재귀함수가 뭔가요
예전에 푸려다가 풀지 않았던 문젠데 과제로 나오다니 😅100x100 크기의 boolean 타입의 배열을 선언하여 받은 좌표에서 10을 더한 좌표까지 체크되지 않았으면 체크를 해주고 sum++ 해준다.
가장 앞의 카드를 버리고, 뒤로 보내는 과정을 반복하므로 Queue를 이용하여 풀이한다. 생각보다 오래걸렸지만 정말 간단했던 문제!
9명의 난쟁이 중 7명을 뽑아 키의 합이 100이 되는지 구해야하므로 순서가 중요하지 않은 조합 문제다.다만, 문제에서 여러 경우가 있을 경우 아무거나 출력하라 하였으니 합이 100이 되는 조합이 한번만 출력되도록 해야한다. 이때 flag 변수를 사용하여 출력이 됐는지
백준 2309번 일곱 난쟁이와 아주 유사한 문제로 이 문제는 답이 유일하여 더욱 간단하다.9명의 난쟁이 중 진짜 난쟁이 7명을 찾아야하므로 순서가 필요 없는 조합 문제이다. 재귀를 통한 조합을 이용하여 합이 100이 되는지 확인 후 출력했다.
같은 구역에 하나의 색만 있다면 그 색의 count++을 하고, 다른 색이 있다면 다시 정사각형의 형태가 되도록 4등분을 한다. 이때 재귀를 이용한 분할 정복 사용!
수빈이가 이동할 수 있는 좌표는 현재 좌표가 X라면 2\*X, X-1, X+1이다. 즉, 한 좌표에서 3개의 좌표로 이동할 수 있다.Queue에 int형 배열로 현재 위치와 초를 넣은 뒤 2\*X, X-1, X+1을 각각 넣어준다. 이때, 값이 K와 같다면 반복문을 종
데일리 실습 문제에 DFS 문제가 있어 DFS의 감을 완벽히 익힐 겸 추가로 풀이한 문제다. 구역의 수를 구하는 것은 \[백준 10026번 적록색약]과 유사하지만 이 문제에서는 각각의 구역의 count를 따로 구해줘야 한다.처음에는 구역의 수를 구하는 메소드와 각 구역
적록색약이 아닌 사람과 적록색약인 사람이 보는 그림은 다르기 때문에 두 개의 배열을 만들어 적록색약인 사람의 배열에서는 R을 G로 바꿔주었다. (난 초록을 좋아하기 때문에 ㅋㅋ)아무튼! 방문한 칸인지 체크하기 위해 boolean 타입 배열을 만들어 가장 최근 값과 사방
재귀로 풀어야함은 알았지만 도저히 어떻게 풀어야할지 감이 잡히지 않아 다른 사람의 풀이를 참고했다.. 다시 풀어보고 이해를 마쳤다!1번 장대에서 3번 장대로 모든 원판들을 옮기려면 가장 아래의 원판, 즉 n번째 원판을 3번 장대로 옮겨야하므로 다른 장대(=2번 장대)로
문제 이름 그대로 DFS와 BFS로 풀면 되는 문제! 너무 오랜만에 알고리즘을 풀어서 푸는 데 꽤나 걸렸다 . . ☆ . .
정말 오랜만에 푼 시뮬레이션. 시도해보았는데 Queue를 이용하는 것까진 생각해냈지만 도저히 로직이 생각나지 않아 풀이를 참고했다 ㅠ.ㅠ나는 다리 위에 올라간 트럭만 Queue에 넣으려고 했는데 풀이를 보니 트럭도 Queue에 넣는 방법으로 풀이하여 참고해서 풀어봤다!
지옥의 알고리즘 다시 시작.수열에서 반복되는 수가 처음 나온 순간 그 이후에도 같은 수가 나올 수 밖에 없다. 이것을 이용해서 DFS를 이용해서 문제를 풀이했다.num은 항상 같은 개수의 자리 수가 들어갈 수 없으므로 while문에서 Math.pow를 이용해서 값을 계
간단히 BFS로 풀이한 문제다.Queue에 1번 컴퓨터부터 넣어서 연결된 컴퓨터의 개수를 세준다. 이때, 1번 컴퓨터부터 탐색을 시작한다는 부분을 못 읽어서 틀렸다가 수정했다. 문제 똑바로 읽기!일단 BFS, DFS 관련 문제들 난이도 높여가면서 풀고 구현으로 넘어가야
백준 BFS, DFS 문제를 검색해서 나온 문제집에서 푼거라 당연히 BFS일줄 알았다..!! 중간에 DFS로 바꿨는데도 풀리지 않아 풀이를 참고했는데 백만년전에 배운(사실 반년 전) 플로이드-워셜로 푸는 문제였던 것이다 (...)N의 범위가 작기 때문에 시간 복잡도는
백준 2606번 바이러스 문제처럼 BFS로 풀이했다가 DFS로 수정했다 😅부모 자식 관계임이 중요하므로 x가 y의 부모일때만 배열에 1로 저장해주고 count가 0일 경우 친척 관계가 없는 것이므로 -1을 출력한다
BFS 사용해서 직사각형의 영역이 아닌 부분, 즉 영역의 개수를 세고 넓이를 구해주면 된다. 영역의 넓이는 Queue에 넣을때마다 ++해준 뒤 ArrayList에 넣는다. 영역의 넓이를 오름차순으로 출력해줘야 하기 때문에 Collections.sort(list) 해주면
\[문제 바로 가기] - 탑Stack으로 풀이하는 문제인건 알았지만 처음부터 다 넣고 비교를 해서 시간초과가 떴다. 생각해보면 이 방식은 Stack으로 풀든 배열로 풀든 비슷한 시간이 나왔을텐데 Stack으로 푼다고 시간이 줄어들진 않았을텐데 😅아무튼 다른 사람의 풀
\[문제 바로 가기] - 쉬운 최단거리오랜만에 푼 알고리즘이라 안 쉬운 최단거리..최단거리를 구하는 문제이므로 BFS를 이용해서 풀면 된다.너무 오랜만의 알고리즘이라 그런지 감을 잃어서 모든 1에서 BFS를 돌려도 시간 초과가 나지 않을거라 생각했다. 당연히 시간 초과
[문제 바로 가기] - 지름길 💡 일단 생각하기! DP로도, 다익스트라로도 풀 수 있는 문제! 나는 DP로 풀이했는데 다익스트라로 푸는 것보다 더 간단하다. 먼저 D + 1 크기의 dp 배열을 만들어준다. 0번째 인덱스 값을 빼고는 다 Integer.MAX_VA
[문제 바로 가기] - 겹치는 건 싫어 💡 일단 생각하기! 투 포인터 연습하기 좋은 문제! 아직 투 포인터에 익숙하지 않아 풀기 좋은 문제였다. start와 end를 모두 0으로 잡고 시작한다. end는 N을 넘으면 안되고 end 인덱스의 값이 중복 개수(=K)
\[문제 바로 가기] - 문자열 교환어제는 투 포인터, 오늘은 슬라이딩 윈도우 문제다.먼저 a를 모두 연속으로 만들기 위해서 a의 개수를 센다.a의 개수만큼의 슬라이딩 윈도우를 만든 후 그 안에 b가 몇개 있는지 센다.즉, b의 개수 = 교환 횟수가 되므로 b의 개수
\[문제 바로 가기] - 비슷한 단어문제의 조건에서는 결국 두 단어가 알파벳 한 개 이하 차이가 나야한다는 것이다.그래서 단어 각각의 List를 만들어 contains로 첫번째 단어의 알파벳 존재 여부를 확인한다. 존재한다면 두 List에서 모두 해당 알파벳을 지운다.
\[문제 바로 가기] - 예산매개변수탐색으로 구현하는 문제!이분탐색과 비슷한데 매개변수탐색은 정렬된 배열이 아니어도 가능하다.right는 최대값, mid는 left과 right의 중간 값이다.mid보다 arr\[i]의 값이 클 경우 mid 값을 총 예산 값에 더하고 작
\[문제 바로 가기] - 랭킹전 대기열단순한 구현 문제1\. 플레이어 레벨과 아이디를 저장할 Map 2. 방 별 기준 레벨을 저장할 List 3. 방에 입장한 플레이어 아이디 저장핧 List 총 세개를 사용했는데 과한가 싶다가도 실행 시간과 메모리는 크진 않아서 수정하
\[문제 바로 가기] - 주식문제 자체는 Stack으로 풀이해서 간단하게 풀었는데 중요한 부분이 있다.문제에서 답은 부호있는 64bit 정수형으로 표현 가능하다라고 나와있는데 int형은 32bit까지만 표현 가능하기 때문에 sum을 long타입으로 선언해주어야 한다.
\[문제 바로 가기] - 에디터문제에서 보다시피 시간 제한이 0.3초로 정말 짧다.근데 나는 하단의 Java 8은 2초라고 되어있어 2초면 거뜬하지 않을까 싶었는데 아니었나 보다..아무튼 처음엔 문제 유형을 보지 않고 풀어서 구현인줄 알았다.이클립스에서는 답이 잘 나와
\[문제 바로 가기] - N번째 큰 수간단하게 우선순위 큐 사용하여 풀이하면 되는 문제로 모든 예제에서 N번째 큰 수를 구해야하므로 내림차순으로 정렬하면 된다.우선순위 큐 오름차순우선순위 큐 내림차순
\[문제 바로 가기] - 한 줄로 서기예제 1번을 보고 처음엔 왼쪽에 선 자기보다 큰 사람 수 = 순서라고 생각하여 풀이했는데 예제 4번에서 걸렸다. 내가 생각한 풀이로는 예제 4번에서 6 2 3 4 5 7 1가 나오는데 이는 5번째 사람보다 큰 사람이 왼쪽에 2명이라
\[문제 바로 가기] - 회전 초밥애증의 회전초밥 -.- 1달전에 도전했다가 피 제대로 보고는 도망쳤었는데 코테 준비를 위해 호기롭게 다시 도전했다.일단 슬라이딩 윈도우로 풀이했으며 옮기는건 크게 어렵지 않았다.하지만 쿠폰 초밥을 처리하는 로직에서 어려움을 겪었고 ht
\[문제 바로 가기] - 단축키 지정단순히 문자열에 대한 이해가 있으면 구현만 하면 되는 문제!다만 이클립스 IDE를 사용하면서 toUpperCase()와 toLowerCase()를 사용해서 다행이지 프로그래머스 툴이었다면 사용하지 못했을 것이다..!!
\[문제 바로 가기] - 1, 2, 3 더하기 4문제 보고 조합? DFS? 이러다가 알고리즘 분류를 봤는데 그놈의 DP였다 -.-일단 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 치기 때문에 중복이 되어서는 안된다. 따라서 오름차순 정렬을 하면 된다!합이 1이
\[문제 바로 가기] - 숨바꼭질 3숨바꼭질 문제와 비슷하지만 다른 부분은 2\*X 이동시에는 0초가 걸린다는 것이다.따라서 1. BFS에서 2\*X를 먼저 넣어주어야 함 2. 위치가 K일 경우 break 하면 안되고 최소값을 구해줘야 함이 부분을 생각하지 못해 여러번
\[문제 바로 가기] - A와 B 2예전에 풀었던 풀이가 언뜻 기억나서 이거 DFS다!! 하고S를 넣어서 A와 B를 추가하고 문자열 뒤집는걸 for문으로 해서 돌렸다.1번에서 시간초과가 나자 for문이 문제인가 싶어 StringBuffer로 뒤집는 방법을 찾아 수정했다
\[문제 바로 가기] - 컨베이어 벨트 위의 로봇문제에 주어진대로 구현하면 되는 문젠데 어떤 자료구조를 써야할지 모르겠어서 풀이를 참고했다.컨베이어 벨트는 클래스를 따로 만들어 해당 칸에 로봇이 있는지와 내구도를 저장해준다. 그리고 LinkedList에 저장을 해주는데
\[문제 바로 가기] - 뱀과 사다리 게임먼저 BFS로 풀이하는 문제임을 알았음에도 도저히 어떻게 풀어야 할지 감히 잡히지 않아 풀이를 참고했다.먼저 좌표가 적힌 1차원 배열 board를 선언한다. board의 값들은 좌표 값과 같지만, 아래와 같이 사다리의 시작점에
\[문제 바로 가기] - 문자열 게임 2두 게임 모두 슬라이딩 윈도우를 사용하여 푸는 것은 알아냈다. 풀이까지 했으나 시간초과가 나서(답이 맞는지는 모르겠다) 풀이를 참고했다 (ㅜㅜ)먼저 문자열 W에 있는 알파벳을 모두 카운트해서 alphabet 배열에 저장한다. 그리
\[문제 바로 가기] - 빗물창고 다각형 문제와 비슷한 문제로 창고 다각형 풀이에서 창고의 골격(?)을 빼주면 된다.가장 큰 기둥을 기준으로 왼쪽과 오른쪽의 (빗물이 찰 넓이 + 골격 넓이)를 구해준다. 그리고 가장 큰 기둥의 높이를 더하고 골격의 넓이를 빼주면 끝!
\[문제 바로 가기] - 녹색 옷 입은 애가 젤다지?다익스트라를 익힐 겸 풀어본 문제로 1년 전에 싸피에서 풀어봤던 문제다.다익스트라에서 중요한 부분최소 합을 저장할 배열 sum을 Integer.MAX_VALUE로 초기화 해준다.이때 (0, 0)에서 시작하므로 sum\
\[문제 바로 가기] - 택배 배송다익스트라로 풀이하는 문제로 처음엔 BFS로 접근했다가 메모리 초과, 런타임 에러로 두드려 맞고 풀이를 참고했다 (^^)연결 리스트를 선언하여 각 노드와 해당 노드와 연결된 노드, 그 가중치(소의 수)를 입력해준다. PriorityQu
\[문제 바로 가기] - 백도어오늘도 다익스트라 문제를 익히기 위해 푼 문제!일반 다익스트라 풀이에서 1. 시야에 보이지 않을 경우 2. dist의 범위를 고려해서 풀이해야 한다.Node 클래스를 선언해서 value의 크기에 따라 오름차순 정렬하고 싶다면시간의 최댓값이
\[문제 바로 가기] - 용액투 포인터로 풀이한 문제로 start와 end를 언제 옮길지만 생각해내면 쉽게 풀이할 수 있는 문제다.start는 0, end는 N-1로 초기값을 설정한 뒤, arr\[start] + arr\[end]의 절댓값이 0보다 크거나 같을 경우에는
[문제 바로 가기] - 잃어버린 괄호 💡 접근 방식 최적해를 찾는 그리디로 접근하면 되는 문제로 결국 최솟값을 찾아야 하므로 빼는 부분이 가장 최대가 되어야 한다. 예시와 같이 55-50+40일 땐 빼는 부분이 최대인 55-(50+40)가 되어야 한다는 뜻이다.
\[문제 바로 가기] - 나무 자르기매개 변수 탐색으로 풀이한 문제로 이분 탐색과는 다른 점이 있다.이분 탐색은 값들 중에서 정렬된 배열에서만 사용 가능하며 target과 일치하는 값을 찾으면 함수를 종료하고 위치를 반환한다.반면 매개 변수 탐색은 정렬이 되지 않아도
[문제 바로 가기] - Fly me to the Alpha Centauri 💡 접근 방식 이 문제의 알고리즘 분류가 수학인 이유가 있다. 직접 손으로 적어가며 규칙을 찾고 그걸 코드로 작성해야 한다. | distance | 이동 거리 | count | 제곱근 |
\[문제 바로 가기] - 용돈 관리유형 : 매개 변수 탐색left와 right의 초기 값 설정이 중요한 문제다.처음에 아무 생각 없이(?) left를 money에서의 최솟값, right를 money에서의 최댓값으로 지정했다가 다음 반례에서 틀렸다. (반례의 답은 100
\[문제 바로 가기] - 평범한 배낭유형 : dp2일 남은 현대오토에버 코딩테스트 대비로 풀이한 문제로 배낭 문제는 예전에 풀어봤지만 (당연히) 풀이가 기억나지 않아 참고했다. 4 76 134 83 65 12먼저 예제로 이해를 하면, 물건 개수 N은 4, 최대로 넣을
\[문제 바로 가기] - 두 배열의 합유형 : 누적합 + 투 포인터부배열이란 해당 배열에서 연속되는 부분 배열이므로 배열의 누적합을 구한다.예를 들면 A = 1, 3, 1, 2일 때위의 표와 같이 구해진다. 따라서 A와 B의 각 누적합을 구해서 listA와 listB에
\[문제 바로 가기] - 신나는 함수 실행유형 : 재귀 + dp문제에 주어진대로 위와 같이 구현하면 시간 초과가 난다.따라서 dp를 사용해서 값을 저장하며 계산해야 시간을 줄일 수 있다.a, b, c 중 하나라도 0 이하면 1a, b, c 중 하나라도 20보다 크면 w
\[문제 바로 가기] - 문제집유형 : 위상정렬 + 우선순위 큐 + 그래프 탐색N개의 문제는 모두 풀어야 한다 - 그래프 탐색먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 한다 - 위상 정렬가능하면 쉬운 문제부터 풀어야 한다
\[문제 바로 가기] - 최소 스패닝 트리유형 : 최소 신장 트리(MST)문제에 나와있다시피, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 최소 신장(스패닝) 트리라고 한다.MST는 1. 크루스칼 알고리즘과 2. 프림 알고
\[문제 바로 가기] - 좋다유형 : 투 포인터문제를 다시 풀었을때 15분 안에 풀지 못하면 풀지 못하는 문제라고 해서 n번째 다시 푸는 문제! n+1번째 다시 풀어야 할 것 같다.101 2 3 4 5 6 7 8 9 10와 같이 N개의 수가 주어질 때 다른 두 수의 합
\[문제 바로 가기] - 친구 네트워크유형 : Union-Find이번주 알고리즘 스터디는 Union-Find 익히기!마침 최소 스패닝 트리 문제를 여러번 다시 풀었는데도 머리에 들어오지 않았는데 잘된 것 같다. 유파 부시기!🔥먼저 문제를 이해하는 데 좀 걸렸던 이유가
[문제 바로 가기] - 공항 유형 : Union-Find 이 문제도 사실 이해가 잘 되지 않아 풀이를 좀 찾아서 이해했다. > 4 3 4 1 1 answer : 2 예제가 위와 같이 있을 때, 게이트의 수 G는 4, 비행기의 수 P는 3이다. 이후 주어지는 값은
\[문제 바로 가기] - 회의준비유형 : Union-Find + 플로이드 워셜 / 다익스트라문제에서 요구하는 것이 무엇인지 정확히 이해해야 한다.나도 처음에는 간선이 가장 적은 사람을 대표자로 뽑으면 되는거 아냐? 하고 BFS로 풀이했다가 21%에서 틀렸습니다를 받았다
\[문제 바로 가기] - 빙산문제에서 요구하는 대로 풀이하면 된다.풀고 나니 그렇게 복잡한 문제가 아니였는데 구현 과정에서 시간이 꽤나 걸렸었다.😅먼저 빙산의 높이를 저장할 2차원 배열 iceberg과 물이 아닌 빙산의 높이만 저장할 List icebergs를 선언한
\[문제 바로 가기] - 대표 선수유형 : 우선순위 큐 사용이 문제는 각 반에서 대표로 선발된 학생들의 능력치의 차이가 최소가 되도록 해야 하는 문제다. 따라서 우선순위 큐를 이용하여 작은 값부터 차이의 최솟값을 구해준다.반 별로 오름차순 정렬12 16 43 677 1
\[문제 바로 가기] - 소문난 칠공주유형 : 조합 + BFS소문난 칠공주의 조건은 1. 7명의 여학생으로 구성 2. 자리가 서로 가로나 세로로 인접해 있어야 함 3. 이다솜파가 4명 이상이여야 함이다.따라서 25명의 학생 중 7명을 조합으로 뽑은 뒤, 이 학생들이 서
\[문제 바로 가기] - 책 나눠주기처음 봤을 때 공항 문제와 유사하다고 생각하여 Union-Find로 풀어볼까 했지만 어떻게 풀어야할지 모르겠어서 문제 유형을 확인했더니 처음 보는 이분 매칭이였다.그래서 이분 매칭에 대한 개념부터 찾아봤다.이분 매칭은 문제처럼 N명의
\[문제 바로 가기] - 가장 긴 증가하는 부분 수열 4📌 유형 : LIS최장 증가 부분 수열(Longest Increasing Subsequence)로 풀이하는 문제로 원소가 N개인 배열의 부분 수열 중, 각 원소가 이전 원소보다 큰 최대 부분 수열을 구하는 것이다
\[문제 바로 가기] - 연속합 2📌 유형 : dp주어진 N개의 정수 중 연속된 수를 선택했을 때 가장 큰 합을 구하는 문제로 특이한 점은 하나의 수를 제거하고 선택할 수 있다는 것이다.1010 -4 3 1 5 6 -35 12 21 -1예제에서 수를 제거하지 않았을
\[문제 바로 가기] - 가장 긴 바이토닉 부분 수열📌 유형 : dp수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다.이 부분을 보
\[문제 바로 가기] - LCS📌 유형 : dp이 문제는 LCS(Longest Common Subsequence), 즉 최장 공통 부분 수열 문제로 개념은 여기에서 이해했다.ACAYKPCAPCAKLCS는 두 수열이 주어졌을 때 가장 긴 공통 부분 수열을 구하면 되는데
\[문제 바로 가기] - 로봇 조종하기📌 유형 : dp최근에 본 기업 코딩테스트 3번 문제와 아주 유사한 문제로 코딩테스트에서는 DFS로 탐색했는데 시간 초과가 났다. 해당 문제는 N과 M이 최대 200까지였음에도 2초를 넘어갔으므로 이 문제에서도 당연히 시간초과가
\[문제 바로 가기] - 빵집가스관과 빵집을 연결하는 파이프라인의 최대 개수를 구하려면 시작점과 도착점의 순서가 중요하다. 무슨 뜻이냐면 시작점을 오름차순으로 탐색한다면, 도착점도 최대한 오름차순으로 도착하도록 해야한다는 뜻이다.나는 열을 0부터 R-1순으로 탐색을 했
\[문제 바로 가기] - 동전 뒤집기개인적으로 어려웠던 문제지만 비트 연산에 대해 익히기 좋았던 것 같다.먼저 N개의 각 행을 뒤집을지 안 뒤집을지 결정을 하는데, 이때 비스마스킹을 사용한다.bit는 0부터 1<<N - 1까지의 값으로 1<<N은
\[문제 바로 가기] - 앱📌 유형 : DP (배낭)평범한 배낭 문제와 비슷하다고 생각하여 처음엔 dp 배열을 각 메모리 값에 따른 최소 비용 값을 구하려고 하였지만 틀렸다.따라서 dp 배열을 앱 = 최대 메모리 크기로 저장해가며 메모리 크기가 M보다 클 경우의 최소
\[문제 바로 가기] - 동전 분배📌 유형 : DP (배낭)처음엔 금액의 합 절반을 조합으로 풀이하려고 했는데 시간초과가 나서 배낭 문제로 풀이했다.합이 홀수인 경우 똑같이 2로 나눌 수 없기 때문에 0dp 배열을 이용한 배낭 풀이dp\[금액] = true는 해당 금
\[문제 바로 가기] - 양팔저울이번주 스터디는 배낭 문제가 주제였기 때문에 이 문제도 배낭 풀이다!아래 적은 첫 풀이에서 하지 못한 중복 체크를 위해 dp 배열을 2차원을 선언해주었다. (dp\[추개수]\[측정가능한무게])dfs를 통해 weights 배열에 있는 추들
\[문제 바로 가기] - 벽 부수고 이동하기📌 유형 : BFS처음엔 간단한 BFS 문제라고 생각하여 Queue에서 {x 좌표, y 좌표, 지금까지 벽을 부순 횟수, 지금까지 이동한 칸의 개수}를 관리해주었다.벽이 아닌 칸이라면 -> 벽 부순 횟수는 그대로, 이동한 칸
\[문제 바로 가기] - 숫자구슬📌 유형 : 매개 변수 탐색이분 탐색 문제를 오랜만에 풀었을 뿐더러 이 문제는 최댓값을 구하고 나서도 나눠진 그룹을 구해야하므로 생각보다 복잡했다.개인적으로 깊게 생각하게 돼서 좋은 문제인 것 같다.먼저 매개 변수 탐색으로 각 그룹의
[문제 바로 가기] - 가장 긴 증가하는 부분 수열 2 📌 유형 : 이분탐색 💡 아이디어 풀이
\[문제 바로 가기] - 장난감 조립📌 유형 : 위상 정렬 + DP + 그래프 탐색처음에는 자료구조 차원에서 풀이할 수 있는 문제라고 생각하여, List와 Map을 사용해서 각 중간 부품이나 완제품에 필요한 부품들의 개수를 더해주려고 했다.하지만 이 문제는 각 부품(
[문제 바로 가기] - 계보 복원가 호석 유형 : 위상 정렬 💡 아이디어 주어지는 정보는 X의 조상 중 Y가 있다이므로 시조가 누구인지, 직계 자식은 누구인지 따로 구분해주어야 한다. 따라서 위상 정렬을 사용하면 좋다. (잊고 있던 위상 정렬의 개념을 이 포스트를 다시 읽고 이해했다.) 먼저 직계 자식의 구분 없이 일단 graph map에 넣어주었...
\[문제 바로 가기] - 포도주 시식유형 : 다이나믹 프로그래밍이전에 풀이했던 계단 오르기 문제와 비슷하다고 생각하여 처음엔 해당 풀이로 먼저 풀이해보았다.하지만 계단 오르기 문제와 다른 점은 1. 건너뛸 수 있는 수의 제한이 없다 2. 마지막 포도주를 꼭 마시지 않아
\[문제 바로 가기] - N과 M (9)유형 : 백트래킹중복되는 수열이 있으면 안된다고 해서 Set, 그 중에서도 수열이 사전 순으로 증가해야 한다고 해서 TreeSet을 사용하기로 했다.처음 풀이(1128ms)순열을 사용해서 풀이했고 TreeSet을 사용해서 그런지
\[문제 바로 가기] - 가르침유형 : 비트마스킹, 백트래킹항상 이런 문제가 있을 때마다 비트마스킹을 사용하는게 편리하단걸 알면서도 사용하지 않았는데 이번에 사용하는 법을 익혀보려고 한다.모든 단어는 anta로 시작되고 tica로 끝나므로 a, n, t, i, c는 무
\[문제 바로 가기] - 숨바꼭질 4유형 : BFS수빈이가 동생을 찾을 수 있는 가장 빠른 시간을 구하려면 BFS를 사용하면 된다.하지만 이 문제는 어떻게 이동하는지 경로까지 출력해야 하기 때문에, 처음에는 Point 클래스에 route라는 String을 저장해서 추가