알고리즘 문제 풀기 1일차
0. 오늘 푼 문제 정리
번호 | 문제명 | 프로그래머스 난이도 |
1 | 직각삼각형 출력하기 | 0 |
2 | 암호 해독 | 0 |
3 | 369게임 | 0 |
4 | 2016년 | 1 |
5 | 나누어 떨어지는 숫자 배열 | 1 |
6 | 수박수박수박수박수박수 | 1 |
7 | 완주하지 못한 선수 | 1 |
8 | 이상한 문자 만들기 | 1 |
9 | 자릿수 더하기 | 1 |
10 | 자연수 뒤집어 배열로 만들기 | 1 |
11 | 정수 내림차순으로 배치하기 | 1 |
12 | 정수 제곱근 판별 | 1 |
13 | 제일 작은 수 제거하기 | 1 |
14 | 콜라츠 추측 | 1 |
15 | 하샤드 수 | 1 |
16 | 3빈법 뒤집기 | 1 |
17 | 최소직사각형 | 1 |
18 | 같은 숫자는 싫어 | 1 |
19 | 2 개 뽑아서 더하기 | 1 |
20 | 로또의 최고 순위와 최저 순위 | 1 |
1. 오늘 알게된 사실
- 클래스를 호출해서 사용하는 것 보다 다소 복잡해도 바닐라 코드를 짜는게 보통 2배정도 빠르다.
- intelliJ에서 ClasscastExeption 에러가 나면 build> Rebuild Project 하면 해결된다.
- java에 ** 을 이용한 제곱은 없다. Math.pow를 쓰자
2. 오늘 찾아보고 사용한 기능
1) String 변수에 + 를 사용하면 char, int 등을 편리하게 붙여서 사용할 수 있음
2) charAt 을 이용하면 아스키 코드값으로 반환되는데, 숫자의 경우 c - '0' 으로 치환할 수있고,
valueOf 기능을 이용해 String으로 바꿔 줄 수 있다.
String answer = "";
int read = code-1;
while (read<cipher.length()){
answer += String.valueOf(cipher.charAt(read));
read += code;
}
return answer;
3) LocalDate 클래스를 호출하여 날자, 요일 , 시간 등을 계산할 수 있다.
import java.time.LocalDate;
class Solution_0003{
public String solution(int a, int b) {
String answer = "";
LocalDate day = LocalDate.of(2016,a,b);
answer = day.getDayOfWeek().toString();
answer = answer.substring(0,3);
return answer;
}
}
4) Java 8 이상의 버전에서는 repeat을 사용할 수 있다.
class Solution_0005_0 {
public String solution(int n) {
String answer = "";
if (n % 2 == 0) {
answer = "수박".repeat(n / 2);
} else {
answer = "수박".repeat(n / 2) + "수";
}
return answer;
}
}
5) List를 사용하여 remove나 add 등을 통하여 array 보다 편하게 사용할 수 있다.
6) 하지만 List를 다시 array로 바꾸는 거는 다소 번거롭다, 함수의 리턴을 List로 바꾸는게 편할 수 도 있다.
7) List도 처음에 길이를 주어줘야하지만 가변성이 있다.
class Solution_0006_1 {
public String solution(String[] participant, String[] completion) {
List<String> list= new ArrayList<>(Arrays.asList(participant));
for (String str : completion) {
list.remove(str);
}
return list.get(0);
}
}
8) 해시맵을 사용하여 맵(딕셔너리)을 구현할 수 있다. 키값에 따른 value 호출은 가능하지만
value는 중복이 되어 직접 찾아줘야 한다.
class Solution_0006_2 {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String,Integer> map = new HashMap<>();
for (String str : participant) {
if (map.containsKey(str)){
map.put(str,map.get(str)+1);
}else {
map.put(str,1);
}
}
for (String str: completion) {
map.put(str, map.get(str)-1);
}
for (String str: participant){
if (map.get(str)==1){
return str;
}
}
return answer;
}
}
9) StringBuilder 클래스를 이용하면 문자열을 좀더 쉽게 개조할 수 있다.
(특정 길이나 지점에 대하여 삭제, 변경, 추가, 역정렬 등이 가능 하다)
import java.lang.StringBuilder;
class Solution_0007 {
public String solution(String s) {
String answer = "";
String [] strArr = s.split(" ");
for(String str: strArr){
for (int i = 0; i < str.length(); i++) {
StringBuilder sb = new StringBuilder(str);
if (i%2==0){
sb.setCharAt(i, Character.toUpperCase(sb.charAt(i)));
str = sb.toString();
}else {
sb.setCharAt(i, Character.toLowerCase(sb.charAt(i)));
str = sb.toString();
}
}
answer += str + " ";
}
answer = answer.substring(0,answer.length()-1);
int count = s.length() - answer.length();
return answer + " ".repeat(count);
}
}
10) int의 경우 최대값이 2,147,483,647 이다. 생각보다 overflow가 잘됨으로 100만 이상을 염두할 때는 생각해야한다.
11)재귀 함수는 while문 보다 편할 때가 있다. 계산량은 비슷하겠지만 관리가 편한 것 같다.
class Solution_0013 {
public int solution(int num) {
int cnt = 0;
if (num == 1) {
return 0;
}
return collatz(num,cnt);
}
public int collatz(long num, int cnt) {
if (num == 1) {
return cnt;
}
if (num % 2 == 0) {
num /= 2;
} else {
num = num * 3 + 1;
}
cnt++;
if (cnt >= 500) {
return -1;
}
return collatz(num, cnt);
}
}
12)10진법을 x진법으로 만드는 것은 n%x 로 간단히 만들 수 있다. 하지만 마지막 자리수(작은수)부터 채워지기에
역정렬을 해야함을 생각해야 한다.
class Solution_0015 {
public int solution(int n) {
int answer = 0;
String third = "";
while (n>0){
third += Integer.toString(n%3);
n = n/3;
}
int j=0;
for (int i = third.length()-1; i >=0; i--,j++) {
answer += (third.charAt(i)-'0')*Math.pow(3,j);
}
return answer;
}
}
13) 배열 내 중복 제거
14) 배열 내 원소 추출(거꾸로 이용하면 특정 구간 추출 및 제거도 가능)
// 배열 => strem => 중복제거 => 배열
String[] resultArr = Arrays.stream(arr).distinct().toArray(String[]::new);
//배열 내 원소 추출
answer=Arrays.copyOfRange(answer,1,answer.length);
3.참조 링크
- 배열 중복 값 제거하기 : https://hianna.tistory.com/554
2. HashMap Value로 key 찾기 : https://developer-talk.tistory.com/393
3. HashMap에 특정 key 존재 여부 확인하기 : https://hianna.tistory.com/574
4.HashMap 사용법 정리 :https://coding-factory.tistory.com/556