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

 

프로그래머스

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

programmers.co.kr

 

import java.util.*;

class Solution {
     public static int solution(int[] topping) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        int res = 0;
        int[] reverseTopping = new int[topping.length];
        for (int i = 0; i < topping.length; i++) {
            reverseTopping[topping.length - 1 - i] = topping[i];
        }

        //list를 채우는 메서드
        fillList(list1, topping);
        fillList(list2, reverseTopping);
        Collections.reverse(list2);

        //토핑 갯수가 동일한 구간 구하기
        for (int i = 0; i < list1.size() - 1; i++) {
            if (list1.get(i).equals(list2.get(i + 1))) res++;
        }

        return res;
    }

    static void fillList(List<Integer> list, int[] topping) {
        Set<Integer> set = new HashSet<>();
        int cnt = 0;

        for (int j : topping) {
            if (!set.contains(j)) {
                set.add(j);
                list.add(++cnt);
            } else {
                list.add(cnt);
            }
        }
    }
}

 

원래 값 비교 부분에서 == 을 이용해서 답이 안나왔다.

if (list1.get(i) == list2.get(i + 1)) res++;

 

Boxed primitive 또는 Wrapper class(Integer) 끼리 비교 하는 경우, 

== 연산자 각 객체의 주소 값 비교 하게 된다. 값끼리의 비교는 equal 메소드를 사용해야한다.

if (list1.get(i).equals(list2.get(i + 1))) res++;

 

 

참고

https://marobiana.tistory.com/130

 

Java의 Integer, int 숫자 비교의 주의사항

예전에 프로그램에 버그가 있었고 원인을 한참을 못찾은적이 있었다.숫자 비교하다 생긴 문제였고, 무심코 코딩하다 틀리고 삽질할 수 있는 부분이라 블로그에 남겨본다.ㅎㅎ 아래는 숫자를 저

marobiana.tistory.com

 

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