프로그래머스 - 시저 암호

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Caesar { String caesar(String s, int n) { n%=26; String result = ""; char[] temp = s.toCharArray(); for(int i=0;i<temp.length;i++) { if(temp[i]>='a' &&temp[i]<='z') temp[i] = (char) ((temp[i]+n)>'z' ? (temp[i]+n-1)%'z'+'a' : (temp[i]+n)); else if(temp[i]>='A' &&temp[i]<='Z') temp[i] = (char) ((temp[i]+n)>'Z' ? (temp[i]+n-1)%'Z'+'A' : (temp[i]+n)); result+=temp[i]; } return result; } public static void main(String[] args) { Caesar c = new Caesar(); System.out.println("s는 'a B z', n은 4인 경우: " + c.caesar("a B z", 4)); } } 알파벳의 대소문자를 조건문의 범위로 확인하는 방법 말고 Character.isLowerCase()가 있음 삼항 연산자를 사용한 라인에서 temp[i] = (char) ((temp[i] - ‘a’ + n) % 26 + ‘a’); 로 하면 분기를 줄일 수 있음 ...

12월 23, 2017 · Jaejin Jang

프로그래머스 - 야근 지수

좀 지저분하긴해도 시간초과 까지 개선한 코드.. N^2으로 풀어도 5초가 넘어서(정답 처리는 됨) 좀더 최적화 해봄 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import java.util.Arrays; public class NoOvertime { public int noOvertime(int no, int[] works) { int result = 0; Arrays.sort(works); int i = works.length-1; Loop1: while(i!=0 && no!=0) { if(works[i]>works[i-1]) { for(int j=i;j<works.length;j++) { if(no==0) { break Loop1; } works[j]--; no--; } continue Loop1; } i--; } while(no!=0) { works[no--%works.length]--; } for(int j=0;j<works.length;j++) { result+=works[j]*works[j]; } return result; } public static void main(String[] args) { NoOvertime c = new NoOvertime(); int []test = {4,3,3}; System.out.println(c.noOvertime(4,test)); } }

12월 23, 2017 · Jaejin Jang

프로그래머스 - 약수의 합

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class SumDivisor { public int sumDivisor(int num) { int answer = 0; for(int i=1;i<=num/2;i++) { if(num%i==0) { answer+=i; } } answer+=num; return answer; } // 아래는 테스트로 출력해 보기 위한 코드입니다. public static void main(String[] args) { SumDivisor c = new SumDivisor(); System.out.println(c.sumDivisor(12)); } } 원래는 반복문의 범위가 [0,num] 까지 였는데 아래의 풀이를 보고 바꿨다. 좋은거 배웠다. ...

12월 23, 2017 · Jaejin Jang

프로그래머스 - 정수 내림차순으로 배치하기

toCharArray를 쓰니 간편하군욤 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import java.util.Arrays; public class ReverseInt { public int reverseInt(int n){ int answer = 0; String a = Integer.toString(n); char[] tmp = a.toCharArray(); Arrays.sort(tmp); for(int i=0;i<a.length();i++) { answer*=10; answer+=tmp[a.length()-1-i]-'0'; } return answer; } // 아래는 테스트로 출력해 보기 위한 코드입니다. public static void main(String[] args){ ReverseInt ri = new ReverseInt(); System.out.println(ri.reverseInt(118372)); } }

12월 23, 2017 · Jaejin Jang

프로그래머스 - 줄서는 방법

문제가 점점 어려워지는군욤 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import java.util.ArrayList; import java.util.Arrays; public class LineCombination { public int[] setAlign(int n, long k) { int[] answer = new int[n]; ArrayList<Integer> list = new ArrayList<Integer>(); int[] fac = new int[n+1]; fac[0] = 1; for(int i=1;i<n;i++) { fac[i] = fac[i-1]*i; } int idx = 0; for(int i=0;i<n;i++) { list.add(i+1); } for(int i=0;i<n;i++) { idx=(int) ((k-1)/fac[n-1-i]); answer[i]=list.get(idx); list.remove(idx); k=(k-1)%fac[n-1-i]+1; } return answer; } // 아래는 테스트로 출력해 보기 위한 코드입니다. public static void main(String[] args) { LineCombination lc = new LineCombination(); System.out.println(Arrays.toString(lc.setAlign(4, 1))); } }

12월 23, 2017 · Jaejin Jang

프로그래머스 - 최고의 집합

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import java.util.Arrays; //테스트로 출력해 보기 위한 코드입니다. public class BestSet { public int[] bestSet(int n, int s){ int[] answer = null; if(n>s) { answer = new int[1]; answer[0]=-1; return answer; } answer = new int[n]; int a = s/n; for(int i=0;i<n;i++) { answer[i]=a; } for(int i=0;i<s%n;i++) { answer[n-1-i]++; } return answer; } public static void main(String[] args) { BestSet c = new BestSet(); //아래는 테스트로 출력해 보기 위한 코드입니다. System.out.println(Arrays.toString(c.bestSet(3,13))); } }

12월 23, 2017 · Jaejin Jang

프로그래머스 - 최대값과 최소값

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import java.util.Vector; public class GetMinMaxString { public String getMinMaxString(String str) { Integer min=Integer.MAX_VALUE,max=Integer.MIN_VALUE; String[] sepstr = str.split(" "); Vector<Integer> vec = new Vector<Integer>(); for(int i=0;i<sepstr.length;i++) { vec.addElement(Integer.parseInt(sepstr[i])); } for(int i=0;i<vec.size();i++) { if(vec.get(i)<min) { min = vec.get(i); } if(vec.get(i) > max) { max = vec.get(i); } } return min+" "+max; } public static void main(String[] args) { String str = "1 2 3 4"; GetMinMaxString minMax = new GetMinMaxString(); //아래는 테스트로 출력해 보기 위한 코드입니다. System.out.println("최대값과 최소값은?" + minMax.getMinMaxString(str)); } } 아래와 같은 풀이가 있다. 좋은 방법인듯 ...

12월 23, 2017 · Jaejin Jang

프로그래머스 - 최대공약수와 최소공배수

유클리트 호제법으로 gcd를 구하고, gcd를 이용해 lcm을 구했다. 포인트는 gcd를 이용해 lcm을 구하는 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import java.util.Arrays; class TryHelloWorld { public int gcd(int a,int b) { if(a==0){ return b; } else { return gcd(b%a,a); } } public int[] gcdlcm(int a, int b) { int gcd = gcd(a,b); int lcm = a*b/gcd; int[] answer = new int[2]; answer[0] = gcd; answer[1] = lcm; return answer; } // 아래는 테스트로 출력해 보기 위한 코드입니다. public static void main(String[] args) { TryHelloWorld c = new TryHelloWorld(); System.out.println(Arrays.toString(c.gcdlcm(3, 12))); } }

12월 23, 2017 · Jaejin Jang

프로그래머스 - 최솟값 만들기

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.util.Arrays; public class TryHelloWorld { public int getMinSum(int []A, int []B) { int answer = 0; Arrays.sort(A); Arrays.sort(B); for(int i=0;i<B.length;i++) { answer += A[i]*B[B.length-1-i]; } return answer; } public static void main(String[] args) { TryHelloWorld test = new TryHelloWorld(); int []A = {1,2}; int []B = {3,4}; System.out.println(test.getMinSum(A,B)); } }

12월 23, 2017 · Jaejin Jang

프로그래머스 - 콜라츠 추측

연산도중에 int형의 범위를 넘어갈 수 있기 때문에 long으로 바꿔주는 것이 포인트! 시간 많이 날림 ㅜ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Collatz { public int collatz(long num) { int answer = 0; int i; for(i=0;i<500;i++) { if(num==1) return answer; if(num%2==0) num/=2; else num = (num*3)+1; answer++; } if(num==1) return answer; else return -1; } // 아래는 테스트로 출력해 보기 위한 코드입니다. public static void main(String[] args) { Collatz c = new Collatz(); int ex = 6; System.out.println(c.collatz(ex)); } }

12월 23, 2017 · Jaejin Jang