프로그래머스 : 예산
https://school.programmers.co.kr/learn/courses/30/lessons/12982
풀이 접근법 : 최대한 많은 부서가 지원을 받아야 하므로, sort한 처음부터 하나씩 예산에서 빼주면서 cnt를 올린다.
import java.util.Arrays;
class Solution {
public int solution(int[] d, int budget) {
int answer = 0;
Arrays.sort(d);
for(int dot : d){
if(dot > budget){
break;
}
budget -= dot;
answer++;
}
return answer;
}
}
프로그래머스 : 시저 암호
https://school.programmers.co.kr/learn/courses/30/lessons/12926
풀이 접근법 : 처음에는 단순하게 char형 변수에 +n 만큼해주려고 하였는데, 생각해보니 a~z , A~Z 아스키코드 값이 다르고 값을 벗어날 경우가 생겨 소문자 배열, 대문자 배열을 각각 만들어 값을 벗어날 경우를 생각하여 % 로 연산해주어 해결하였다.
class Solution {
public String solution(String s, int n) {
String answer = "";
StringBuilder sb = new StringBuilder();
char[] lcAp = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char[] hiAp = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
for(char c : s.toCharArray())
{
if(c >= 'a' && c <= 'z') {
sb.append(lcAp[(c-'a'+n) % 26]);
}else if(c >= 'A' && c <= 'Z'){
sb.append(hiAp[(c-'A'+n) % 26]);
}else{
sb.append(c);
}
}
answer = sb.toString();
return answer;
}
}
프로그래머스 : 최소직사각형
https://school.programmers.co.kr/learn/courses/30/lessons/86491
풀이접근법 : 가로, 세로 중 큰값 , 작은 값을 가려내어 각각의 값에서 max값을 뽑아낸다.
class Solution {
public int solution(int[][] sizes) {
int answer = 0;
int max = 0;
int min = 0;
for(int i =0; i< sizes.length; i++){
if(sizes[i][0] > sizes[i][1]){
max = Math.max(max,sizes[i][0]);
min = Math.max(min,sizes[i][1]);
}else{
max = Math.max(max,sizes[i][1]);
min = Math.max(min,sizes[i][0]);
}
}
System.out.print( max + " " + min);
answer = max * min;
return answer;
}
}
프로그래머스 : [1차] 비밀지도
https://school.programmers.co.kr/learn/courses/30/lessons/17681
풀이 접근법 : arr1, arr2 int 배열로 들어오는 값을 arr1[i], arr2[i] 을 OR 연산을 하여 둘 중 하나만이라도 2진수로 표현하였을 때 1이 있는 경우를 계산한다. String s = Integer.toBinaryString(arr1[i] | arr2[i]); 으로 받은 s을 char로 나누어 1이면 #, 0이면 공백(" ") 넣어주는 방식으로 풀이하였다.
(이렇게만 풀 경우, 값이 작을 경우 6자리를 다 채우지 못하고 나오는 경우가 있는데, 그럴 경우 s의 길이와 n의 길이를 비교하여 차이만큼 s 앞에 0을 붙여주었다.)
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for(int i=0; i< arr1.length; i++){
String s = Integer.toBinaryString(arr1[i] | arr2[i]);
StringBuilder sb = new StringBuilder();
if(s.length() != n){
for(int j=0; j< n-s.length(); j++){
sb.append(" ");
}
}
for(char c : s.toCharArray()){
if(c == '1'){
sb.append("#");
}else{
sb.append(" ");
}
}
answer[i] = sb.toString();
}
return answer;
}
}
프로그래머스 : 문자열 내 마음대로 정하기
https://school.programmers.co.kr/learn/courses/30/lessons/12915#
풀이 접근법: 우선순위 큐 : PriorityQueue<String>을 사용하여 (new Comparator<String>() {
@Override
public int compare(String o1, String o2) {}를 사용하여 비교 함수를 구현하여 문제에서 나온 순서대로 정렬하고, poll()해서 하나씩 합쳐 출력한다. compare() 함수 구현에 있어, n 번째 char를 비교하고 같은 문자이면 뒷쪽은 사전 순서로 정렬하는데 아래와 같이 구현하면 될 줄 알았는데, 통과하지 못하였다.
public int compare(String o1, String o2) {
char[] o1ch = o1.toCharArray();
char[] o2ch = o2.toCharArray();
if(o1ch[n] == o2ch[n]){
return o1ch[n+1]-o2ch[n+1];
}
return o1ch[n]-o2ch[n];
}
위 코드와 같이 구현하면 다음 char만 확인해 정렬하므로, 문제가 요구하는 순서대로 정렬할 수 없다. 그래서 아래와 같이 compartTo함수를 사용하면 string을 사전순으로 정렬할 수 있다.
public int compare(String o1, String o2) {
char[] o1ch = o1.toCharArray();
char[] o2ch = o2.toCharArray();
if(o1ch[n] == o2ch[n]){
return o1.compareTo(o2);
}
return o1ch[n]-o2ch[n];
}
전체 코드 :
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
PriorityQueue<String> pq = new PriorityQueue<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
char[] o1ch = o1.toCharArray();
char[] o2ch = o2.toCharArray();
if(o1ch[n] == o2ch[n]){
return o1.compareTo(o2);
}
return o1ch[n]-o2ch[n];
}
});
for(String s : strings){
pq.offer(s);
}
for(int i = 0; i<strings.length; i++){
answer[i] = pq.poll();
}
return answer;
}
}
'Java' 카테고리의 다른 글
[Java] 03/28 알고리즘 문제 (0) | 2023.03.29 |
---|---|
[알고리즘] 최소 신장 트리(Minimum Spanning Tree) (0) | 2023.03.25 |
프로그래머스 : 이상한 문자 만들기 (0) | 2023.03.23 |
최단 경로 알고리즘 (0) | 2023.03.23 |
다이나믹 프로그래밍(DP), 백트래킹(Backtracking) (0) | 2023.03.21 |