1. 2016년
풀이 )
배열에 저장한 다음에 푸는 것이 핵심.
class Solution {
public String solution(int a, int b) {
int[] month = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 30, 31 };
String[] week = { "THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED" };
int day = 0;
for (int i = 0; i < a; i++)
day += month[i];
day+=b;
return week[day % 7];
}
}
2. 삼진법 뒤집기
풀이 )
3진법 값을 먼저 구한 뒤에 문자열 s에 나머지 값들을 더해서 뒤집은 3진법을 만들어 준다.
예를들어 45면 0021가 s에 저장됨.
그 후 앞에서부터 한개씩 길이에서 (i+1) 만큼 빼준 값을 3의 거듭제곱 Math.pow를 이용해 풀어주고 더해주면 된다.
class Solution {
public int solution(int n) {
String s = "";
int result = 0;
while (n > 0) {
s += String.valueOf(n % 3);
n /= 3;
}
for (int i = 0; i < s.length(); i++) {
result += (s.charAt(i) - '0') * (Math.pow(3, s.length() - i - 1));
}
return result;
}
}
*배운 것
자바에서는 파이썬에서 처럼 **을 이용해 거듭제곱을 구할 수 없고 Math.pow(i,j) 를 사용해야 한다.
3. 가운데 글자 가져오기
class Solution {
public String solution(String s) {
if (s.length() %2 ==1)
return String.valueOf(s.charAt(s.length() / 2));
else
return s.substring(s.length() / 2 - 1, s.length() / 2 + 1);
}
}
다른 풀이법 코드
class StringExercise{
String getMiddle(String word){
return word.substring((word.length()-1) / 2, word.length()/2 + 1);
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args){
StringExercise se = new StringExercise();
System.out.println(se.getMiddle("power"));
}
}
*배운 것
-문자열 slice하기 => substring(a,b) => a에서 b까지 자르기
- char를 String으로 변환 => String.valueOf()
4. 같은 숫자는 싫어
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] != arr[i + 1]) {
tempList.add(arr[i]);
}
}
tempList.add(arr[arr.length - 1]);
int[] answer = new int[tempList.size()];
for(int i=0; i<answer.length; i++) {
answer[i] = tempList.get(i);
}
return answer;
}
}
*배운 것
이 문제에서 int[]로 return을 해줘야 하기 때문에 ArrayList로 만든것을 다시 int[]로 옮겨주었다.
ArrayList를 만들어서 add() 를 통해서 list에 원소를 추가할 수 있다.
5. 나누어 떨어지는 숫자 배열
풀이)
Sort , 예외처리
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int[] solution(int[] arr, int divisor) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) {
tempList.add(arr[i]);
}
}
if (tempList.size()==0){
int[] answer={-1};
return answer;
}
Collections.sort(tempList);
int[] answer = new int[tempList.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = tempList.get(i);
}
return answer;
}
}
*배운 것
- ArrayList를 sort하는 방법 => Collections.sort(ArrayList); 또는 array를 Arrays.sort(array)
6. 두 정수의 합
class Solution {
public long solution(int a, int b) {
long answer = 0;
for (int i = ((a < b) ? a : b); i <= ((a < b) ? b : a); i++)
answer += i;
return answer;
}
}
7. 문자열 내 마음대로 정렬하기
풀이 1) Comparator를 활용한 풀이
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.charAt(n) - s2.charAt(n) != 0
? s1.charAt(n) - s2.charAt(n) // 양수면 객체 순서 변경
: s1.compareTo(s2); // 두 문자중 사전순으로 빠른거.
}
});
return strings;
}
}
풀이 2)
다른 사람 풀이인데 기발해서 가져왔다.
index를 앞에 두고 기존 문자를 뒤에 저장한 다음에 정렬한다. 그 뒤에 앞에 index만 떼주면 정답을 구할 수 있음.
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> arr = new ArrayList<>();
for (int i = 0; i < strings.length; i++) {
arr.add("" + strings[i].charAt(n) + strings[i]);
}
Collections.sort(arr);
answer = new String[arr.size()];
for (int i = 0; i < arr.size(); i++) {
answer[i] = arr.get(i).substring(1, arr.get(i).length());
}
return answer;
}
}
*배운 것
- Comparator 활용법
compare에서 양수면 객체 순서 변경, 음수또는 0이면 객체 순서 유지 ( 오름차순)
- 기발한 풀이 (index를 앞에 저장후 정렬하고 제거)
8. 문자열 내 p와 y의 개수
풀이 1)
toCharArray() 사용
class Solution {
boolean solution(String s) {
boolean answer = true;
int pcount=0,ycount=0;
char[] temp = s.toCharArray();
for(int i =0; i<temp.length; i++) {
if(temp[i]=='p'||temp[i]=='P')
pcount++;
else if(temp[i]=='y'||temp[i]=='Y')
ycount++;
}
if(pcount==ycount)
return true;
else
return false;
}
}
풀이 2)
charAt() 사용
class Solution {
boolean solution(String s) {
boolean answer = true;
int pcount=0,ycount=0;
for(int i =0; i<s.length(); i++) {
if(s.charAt(i)=='p'||s.charAt(i)=='P')
pcount++;
else if(s.charAt(i)=='y'||s.charAt(i)=='Y')
ycount++;
}
if(pcount==ycount)
return true;
else
return false;
}
}
*배운 점
String에 toCharArray()를 하면 char형 배열이 만들어 지는것.
9. 서울에서 김서방 찾기
class Solution {
public String solution(String[] seoul) {
int index=0;
for(int i=0;i<seoul.length;i++){
if(seoul[i].equals("Kim")){
index=i;
break;
}
}
String answer = "김서방은 "+ index + "에 있다";
return answer;
}
}
*배운 점
자바에서 String을 비교하려면 ==을 쓰면 안되고 equals() 를 써야 한다.
10. 소수 찾기
=> 에라토스테네스의 체를 이용한다. 자세한 내용은 이전 포스트를 읽어보길..
2부터 진행하면서 그것의 배수들을 소수가 아니라고 체크한다. 그리고 체크가 안된 것들만 다시 체크한다. 일반적으로 소수를 찾을 때 보다 훨씬 빠르게 소수를 찾을 수 있다.
// 에라토스테네스의 체 사용
class Solution {
public int solution(int n) {
int count = 0;
boolean[] arr = new boolean[n + 1];
arr[0] = true;
arr[1] = true; // 0,1은 소수가 아님
// 2 부터 숫자를 키워가며 배수 제외(true할당)
for (int i = 2; i * i < n + 1; i++) {
if (!arr[i]) { // 이미 소수로 제외된게 아닐 경우
for (int j = i * i; j < n + 1; j += i) {
arr[j] = true;
}
}
}
for (int i = 0; i <= n; i += 1) {
if (!arr[i]) {
count++;
}
}
return count;
}
}
'Algorithm(알고리즘) > 프로그래머스 고득점 Kit' 카테고리의 다른 글
Java 프로그래머스 Level1 연습문제 모음 #3 (21~32) (0) | 2020.12.30 |
---|---|
Java 프로그래머스 Level1 연습문제 모음 #2 (11~20) (0) | 2020.12.30 |
프로그래머스 - 체육복 Level1 파이썬 (0) | 2020.12.21 |
프로그래머스 - 완주하지 못한 선수 Level1 파이썬 (0) | 2020.12.20 |
프로그래머스 - 크레인 인형뽑기 게임 2019 카카오 (Stack) Level1파이썬 (0) | 2020.12.20 |