목록알고리즘 (23)
동그란 도그린
입력 괄호( ’(’와 ‘)’ )로 이루어진 문자열 s ( s의 길이 ≤ 100,000 ) 출력 문자열 s가 올바른 괄호이면 true를, 올바르지 않은 괄호라면 false를 반환 풀이 방법 스택 이용 문자가 ‘(’이면 스택에 저장 문자가 ‘)’이면 peek()을 이용하여 스택 상단의 값을 확인했을 때 ‘(’이면 pop() 스택 상단의 값이 ‘)’이거나 스택이 비어있다면 false를 반환하고, 반복문 빠져나옴 반복문을 모두 끝낸 뒤 스택이 비어있지 않다면 false를 반환 코드 import java.util.Stack; class Solution { boolean solution(String s) { boolean answer = true; Stack stack = new Stack(); for(int i=..
compareTo()는 두 개의 값(숫자/문자)을 비교하여 int 값으로 반환해준다. 숫자 비교 (Integer) 예를 들어 a=9, b=3이라면, a.compareTo(b)는 1, a.compareTo(9)는 0, a.comparteTo(10)은 -1 을 반환한다. 즉, 기준 값(a)이 비교 대상(b)보다 크면 1, 같으면 0, 작으면 -1을 반환한다. int형 비교 int a=9; int b=3; Integer.compare(a, b); Integer.compare()를 이용한다. 문자 비교 1) 비교 대상에 동일한 문자가 포함되어있는 경우 String str="abcd"; str.compareTo("abcd"); // 일치하는 경우, 0을 반환한다. str.compareTo("aefg"); 2) 비..
Arrays.copyOf()와 Arrays.copyOfRange()를 통해 배열을 복사할 수 있다. Arrays.copyOfRange()는 특정 범위만큼 복사할 수 있다. Arrays.copyOf(복사할 배열, 배열 크기) Arrays.copyOfRange(복사할 배열, 시작 인덱스, 마지막 인덱스) → 시작 인덱스부터 (마지막 인덱스-1)까지 복사된다. 📍 관련 문제 (프로그래머스 - K번째수) https://school.programmers.co.kr/learn/courses/30/lessons/42748
입력 N 입력 (1 ≤ N ≤ 90) 출력 N자리 이친수의 개수 출력 풀이 방법 N이 2일 때 이친수는 10으로, 1개 N이 3일 때 이친수는 101, 100으로, 2개 N이 4일 때 이친수는 1001, 1010, 1000으로, 10(01) - N이 2일 때의 이친수에 01을 덧붙인 수 101(0), 100(0) - N이 3일 때의 이친수에 0을 덧붙인 수 따라서 N=4일 때의 이친수 개수는 (N=2일 때의 이친수 개수)+(N=3일 때의 이친수 개수) = 1+2 = 3 N이 5일 때 이친수는 10101, 10001, 10010, 10100, 10000으로, 101(01), 100(01) - N이 3일 때의 이친수에 01을 덧붙인 수 1001(0), 1010(0), 1000(0) - N이 4일 때의 이친수..
입력 테스트 케이스 개수 T T개의 줄에 정수 n 입력 (0 ≤ n < 11) 출력 각 테스트 케이스마다 정수 n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력 풀이 방법 다이나믹 프로그래밍 이용 (정수 n을 1,2,3의 합으로 나타내는 경우) = (정수 n-1을 1,2,3의 합으로 나타내는 각각의 경우에 1을 더한 경우) + (정수 n-2를 1,2,3의 합으로 나타내는 각각의 경우에 2를 더한 경우) + (정수 n-3을 1,2,3의 합으로 나타내는 각각의 경우에 3을 더한 경우) 예를 들어, 4를 1,2,3의 합으로 나타내는 경우는 (3) +1 = (2+1) +1 = (1+2) +1 = (1+1+1) +1 (2) +2 = (1+1) +2 (1) +3 으로, (3을 1,2,3의 합으로 나타내는 방법..
입력 자연수 N과 M 입력 (1 ≤ M ≤ N ≤ 8) 출력 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 출력 (중복 X, 각 수열은 공백으로 구분해서 출력, 사전 순으로 증가하는 순서로 출력) 같은 수를 여러 번 골라도 됨 (15649번 : N과 M (1) 문제와 다른 부분) 풀이 방법 15649번 문제와 같은 방법으로 풀되, 같은 수를 여러 번 골라도 되므로 visit[] 배열을 이용하여 방문 여부를 체크할 필요가 없음 [코드 1]에서 Scanner를 사용하여 입력을 받고, cnt가 M이 될 때마다 System.out.print()를 이용하여 출력을 해줬더니 시간이 초과됨 시간 초과 문제를 해결하기 위해 [코드 2]에서는 Scanner 대신 BufferedReader를 사용하여 입력을 받..
입력 자연수 N과 M 입력 (1 ≤ M ≤ N ≤ 8) 출력 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 출력 (중복 X, 각 수열은 공백으로 구분해서 출력, 사전 순으로 증가하는 순서로 출력) 고른 수열은 오름차순이어야 함 (15649번 : N과 M (1) 문제와 다른 부분) 풀이 방법 수열을 오름차순으로 만들기 위해 15649번 문제와는 달리 backtracking 함수 내부 for문의 초기값을 1이 아닌 cur+1로 설정 for(int i=cur+1;i
입력 자연수 N과 M 입력 (1 ≤ M ≤ N ≤ 8) 출력 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 출력 (중복 X, 각 수열은 공백으로 구분해서 출력, 사전 순으로 증가하는 순서로 출력) 풀이 방법 백트래킹 이용 visit 배열을 이용하여 방문한 숫자 체크 처음에는 [코드 1]처럼 작성하였으나 [코드 1]은 시간이 오래 걸리고 코드가 길어서 [코드 2]로 수정 [코드 1] : ArrayList를 이용하여 수열 저장 [코드 2] : ans 배열을 이용하여 수열 저장 코드 [코드 1] - ArrayList 사용 import java.util.*; public class BOJ_15649 { static int N, M; static int[] visit; static ArrayList l..