https://leetcode.com/problems/ransom-note/description/

 

Ransom Note - LeetCode

Ransom Note - Given two strings ransomNote and magazine, return true if ransomNote can be constructed by using the letters from magazine and false otherwise. Each letter in magazine can only be used once in ransomNote.   Example 1: Input: ransomNote = "a"

leetcode.com

 

문제

문제에서 2개의 문자열(ransomNote, magazine)이 주어진다.
magazine을 구성하는 문자를 이용하여 ransomNote와 동일한 문자열을 만들 수 있는냐가 문제의 핵심이다.
canConstruct("aab", "baa"); -> true

ransomNote and magazine consist of lowercase English letters.

소문자로만 이루어져서 길이 26의 int배열을 만들고 magazine의 개수를 넣어준다.

배열과 ransomNote를 비교하여 T/F 리턴

 

public static boolean canConstruct(String ransomNote, String magazine) {

    // 소문자 배열을 만들어서 magzine 넣는다.
    int[] mag = new int[26];
    for (char m : magazine.toCharArray()) {
        int idx = m - 97;
        mag[idx]++;
    }

    // ransomNote 돌려가면서 배열에 있는지 확인한다.
    for (char r : ransomNote.toCharArray()) {
        int idx = r - 97;
        if (mag[idx] == 0) return false;
        mag[idx]--;
    }

    // for문을 다 돌았으면 true 리턴한다.
    return true;
}

시간복잡도 : O(n)

 

https://school.programmers.co.kr/learn/courses/30/lessons/131701

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

public class P131701 {
    /*
    {4,7,9,1,1} -> {4,7,9,1,1,4,7,9,1} 로 늘어뜨려서 계산
    set에 담아서 중복 제거
     */

    public int solution(int[] elements) {
        Set<Integer> set = new HashSet<>();
        List<Integer> arr = new ArrayList<>();
        for (int e : elements) {
            arr.add(e);
        }
        arr.addAll(arr);
        arr.remove(arr.size() - 1);

        for (int i = 0; i < elements.length; i++) {
            int sum = 0;
            for (int k = i; k < i + elements.length; k++) {
                sum += arr.get(k);
                set.add(sum);
            }
        }
        return set.size();
    }
}

import java.util.*;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
      
        // 1. lost와 reserve set에 넣어주기
        Set<Integer> lo = new HashSet<>();
        Set<Integer> re = new HashSet<>();

        for (int r : reserve) re.add(r);
        for (int l : lost) {
            if (re.contains(l)) {
                re.remove(l);
            } else {
                lo.add(l);
            }
        }


//        여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
//        이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
        for (int l : lo) {
            if (re.contains(l)) {
                re.remove(l);
                lo.remove(l);
            }
        }

        // 2.  lost에서 빌릴 수 있는 친구 제거하기
        for (int r : re) {
            if (lo.contains(r - 1)) {
                lo.remove(r - 1);
            } else if (lo.contains(r + 1)) {
                lo.remove(r + 1);
            }
        }

        // 3. 못 빌린 친구 제외하고 리턴
        return n - lo.size();
    }
}

https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 1

1. Integer.toBinaryString 으로 비트연산 한 결과를 2진수로 바꾼다.

2. replaceAll로 0과 1을 공배고가 #으로 변환

3. 모자란 개수는 필요한 만큼 앞부분에 공백 더해주기

public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] ans = new String[n];

        for (int i = 0; i < n; i++) {
            //Binary로 바꿔서 0은 공백 1을 #으로 변환한다.
            ans[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
            ans[i] = ans[i].replaceAll("0", " ");
            ans[i] = ans[i].replaceAll("1", "#");

            //공간이 비는 부분은 필요한 개수만큼 앞에 공백을 넣어주기 
            while (ans[i].length() < n) {
                ans[i] = ' ' + ans[i];
            }
        }
        return ans;
    }

 

다른 풀이

format으로 공백 만들어주기 

String.format("%5s","123") >> _ _123

 public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        for (int i = 0; i < n; i++) {
            result[i] = String.format("%" + n + "s", result[i]);
            result[i] = result[i].replaceAll("1", "#");
            result[i] = result[i].replaceAll("0", " ");
        }

        return result;
    }

 

 

풀이

public static String solution(String s) {
        //주어진 s를 하나하나 split해서 String 배열로 만든다.
        String[] str = s.split("");
        // return 할 String
        String ans = "";
        // index 역할을 하는 변수. 홀수와 짝수를 판별해서 대소문자를 구분한다.
        int cnt = 0;

        // 공백이면 cnt값을 0으로 초기화하고 조건에 맞춰서 대소문자 변환 후 ans에 더해준다.
        for (String ss : str){
            cnt = ss.equals(" ") ? 0 : cnt+1;
            ans += cnt % 2 != 0 ? ss.toUpperCase():ss.toLowerCase();
        }
        return ans;
    }

 

공백없이 split(""); 쓰면 하나하나 잘린다. 

 String s = "  tRy hello  WORLD    ";
 char[] str = s.split("");
 
 /* 출력
ss =  
ss =  
ss = t
ss = R
ss = y
ss =  
ss = h
ss = e
ss = l
ss = l
ss = o
ss =  
ss =  
ss = W
ss = O
ss = R
ss = L
ss = D
ss =  
ss =  
ss =  
ss =  

*/

이 문제에서는 리턴되는 문자열에서 중간에 공백 여러개 생기는건 고려하지 않아도 되는거 같다.

 

 

풀이

1. 한번씩 훑으면서 중복이 아니면 Arraylist에 넣어준다. 배열 크기를 모르므로 Arraylist 사용.

2. ArrayList를 int배열로 변환한 후 리턴.

 

 public int[] solution(int[] arr) {
        // ArrayList 생성하고 첫번재 원소만 넣어주기
        List<Integer> list = new ArrayList();
        list.add(arr[0]);
        
        //두번째 원소부터 전 원소하고 비교해서 중복이 아니면 list에 넣기
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] != arr[i - 1])
                list.add(arr[i]);
        }
        
        // ArrayList to int array
        return list.stream()
                .mapToInt(Integer::intValue)
                .toArray();
    }

풀이

1. String 을 char배열로 변환 후 정렬한다.

2. StringBuilder 생성 후 정렬한걸 거꾸로 넣어준다.

3. 다시 String 으로 변환 후 리턴

 public String solution(String s) {
       // String 을 char배열로 변환 후 정렬한다.
        char[] aso = s.toCharArray();
        Arrays.sort(aso);
        
        // StringBuilder 생성 후 정렬한걸 거꾸로 넣어준다.
        StringBuilder sb = new StringBuilder();
        for (int i = s.length() - 1; i > -1; i--) {
            sb.append(aso[i]);
        }
        
        // 다시 String 으로 변환 후 리턴
        String res = sb.toString();
        return res;
    }

 

다른 풀이

1. String을 char배열로 변환 후 정렬

2.

  • char배열을 String객체로 변환 > new String(sol)
  • String으로 변환한걸 StringBuilder객체로 변환 > new StringBuilder(new String(sol))
  • StringBuilder로 변환한걸 역으로 정렬 > new StringBuilder(new String(sol)).reverse()
  • 한걸 String으로 변환 > new StringBuilder(new String(sol)).reverse().toString(); 
 public String reverseStr(String str){
    char[] sol = str.toCharArray();
    Arrays.sort(sol);
    return new StringBuilder(new String(sol)).reverse().toString();
    }

 

처음에 접근할 땐 return 할 int 배열을 arr길이와 동일한 길이로 설정해놓고 선언한 다음에 인덱스에 값을 넣는 방식으로 진행했는데, 값을 넣지 않는 자리는 0으로 초기화 되서 출력됐다.

[5,10] 으로 나온게 아니라 [5,10,0,0]으로 나옴

 

>>  return할 int 배열을 list로 받아서 요소 넣은 다음 int 배열로 변환하고 리턴

풀이

 public int[] solution(int[] arr, int div) {
        // list 생성
        List<Integer> list = new ArrayList<Integer>();
        for (int a : arr) {
            if (a % div == 0) {
                list.add(a);
            }
        }
        //리스트 정렬
        Collections.sort(list);
        if (list == null) list.add(-1);

        // list를 int배열로 변환후 리턴
        int[] res = list.stream().mapToInt(i -> (int) i).toArray();
        return res;
    }

 

ArrayList를 int배열로 변환 방법

https://velog.io/@deannn/Java-int%ED%98%95-ArrayList-%EB%B0%B0%EC%97%B4-%EB%B3%80%ED%99%98

 

[Java] Integer ArrayList을 int 배열로 변환 방법

String 타입의 List를 배열로 변환할 때는 toArray()를 사용하면 변환할 수 있다. 하지만 int형과 같은 primitive 타입은 toArray()를 사용할 수 없다. 따라서 int형과 같은 primitive 타입은 아래의 방법을 통해

velog.io

 

list 정렬 방법

https://codechacha.com/ko/java-sort-list/#2-listsort%EB%A1%9C-list-%EC%A0%95%EB%A0%AC

+ Recent posts