본문 바로가기
카테고리 없음

TIL 230127

by hbIncoding 2023. 1. 28.

알고리즘 문제 풀기 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.참조 링크

  1. 배열 중복 값 제거하기 : https://hianna.tistory.com/554
 

[Java] 배열 중복 값 제거하기 (Set, Stream)

배열에서 중복값을 제거하는 방법입니다. Set Stream 1. Set Set은 중복된 값을 가지지 않는 Collection입니다. 따라서, 배열을 Set 타입으로 변환하면, 중복을 제거할 수 있습니다. 1.1 HashSet HashSet은 Set 인

hianna.tistory.com

   2. HashMap Value로 key 찾기 : https://developer-talk.tistory.com/393

 

[Java]HashMap value로 key 찾기

이번 포스팅은 HashMap에서 value로 key를 찾는 다양한 방법들을 소개합니다. value을 사용하여 key를 찾는 방법(1:1) HashMap 클래스는 키(key)-값(Value) 쌍을 저장할 수 있는 Java의 컬렉션입니다. 키를 사용

developer-talk.tistory.com

  3. HashMap에 특정 key 존재 여부 확인하기 : https://hianna.tistory.com/574

 

[Java] HashMap에 특정 key 존재 여부 확인하기

Map.containsKey() Map.get() 1. Map.containsKey() public boolean containsKey​(Object key) Map의 containsKey() 메소드는 Map에 파라미터로 입력받은 값과 같은 값이 있으면 true를 리턴합니다. import java.util.HashMap; import java.u

hianna.tistory.com

 4.HashMap 사용법 정리 :https://coding-factory.tistory.com/556

 

[Java] 자바 HashMap 사용법 & 예제 총정리

HashMap 이란? HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. Map은 키와 값으로 구성된 Entry객체를 저장하는

coding-factory.tistory.com