자료구조와 알고리듬 With Java/[Study] BAEKJOON 프로그래머스 CodeUp LeetCode

[09월 1주차] 알고리즘 스터디

계란💕 2022. 9. 5. 01:25

1. k진수에서 소수의 개수 구하기

09-04 일

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/92335

 

프로그래머스

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

programmers.co.kr

 

================================= 86점 =================================

  • 소수인지 확인하는 메서드를 만든다.
  • k진수로 바꾸는 while문 => 다음부터는 k진법으로 바꿀 때, Integer.toString(n, k)를 쓰도록 하자!
  • 0이 나올 때마다 pre0Idx를 업데이트해준다.
  • 어느 부분이 틀렸을까?
    • 0이 하나도 없는 경우
    • p가 소수인 경우 / 합성수인 경우 두가지가 있으니까 합성수인 경우는 return  0을 해줘야 하는데 이 부분을 안 넣었다. 
java
열기

 

  MySol) 100점

java
열기
  • k진법으로 바꾼 결과를 isPrime()에 넣어서 확인할 때 long으로 해야한다. 숫자가 커질 수 있음
  • curr0idx는 1씩 커지기 때문에 사실상 currIdx에 더 가깝다. 
  • pre0Idx는 현재 인덱스보다 작은 0 중에 가장 큰 인덱스를 의미한다.
  • 나중에 알게 됐는데 Integer.toString(n, k) 를 이용하면 n을 k진법으로 바꿔준다.

 

  Sol) Gui - Deque 이용

스터디원 블로그 - https://guiwoo.tistory.com/

java
열기
  • 가장 빠른 방법
  • 역시 Deque가 좋기는 좋다..

 

 

  Sol) Gyu - Deque 이용

java
열기
  • Deque를 이용하면 시간이 더 짧다.
  • 보다시피 내 코드랑 비교했을 때 시간이 10배 정도 차이가 난다.

 

 

 

2.  주차 요금 계산

09-05 월

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

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

programmers.co.kr

 

 MySol) 0.xx ~ 9.6x ms

  • 출력부 없는 버전 - 주석, main() 제거
java
열기
  • 출력부 포함
java
열기
  • 차량이 들어오는 경우는 시간을 (-), 차량이 나가는 경우는 (+) 해서 총 주차한 시간을 구한다.
  • 시간은 분 단위로 바꾸는 것이 계산하기 편리한다. 
  • 마지막에 PQ<String>를 이용해서 차량 번호가 작은 것부터 먼저 뽑아서 answer에 value를 넣는다.
    • PQ에서 하나씩 뽑으면 차량 번호가 작은 것부터 뽑히니까 작은 것부터 answer에 넣으면서 처리한다.
  • 차량 출차된 내역이 없는 경우는  for문이 끝난 다음에 total 시간이 마이너스 인 경우에 해당한다. out이 있어야만 총 시간이 + 될 것이기 때문이다. 

 

 

  Sol) Ia

스터디원 블로그 - https://velog.io/@kormeian

java
열기
  • 로직이 나와 거의 같다.
  • 처음에 이 문제를 못 풀다가 pq로 정렬하는 방법을 힌트로 주셔서 나중에 겨우 풀 수 있었다.
  • StringTokenizer: 사용자가 지정하는 구분자를 경계로해서 문자열을 나눠준다. 
    • StringTokenizer(st.nextToken(), ":")
    • nextToken() 을 할 때 마다 구분자 기준으로 다음에 오는 값을 읽어 온다.'
    • 내가 사용한 subString 보다 훨씬 간단한 느낌이다. subString()은 인덱스 번호를 맞춰야되야해서 StringTokenizer가 이 문제 푸는데 더 적합하다.
    • map.getOrDefault()는 내 코드와 동일하게 들어갔다.
    • 기존에 있는 value에 값을 더하거나 빼야하기 때문에 메서드가 꼭 필요하다.

 

 

  Sol) 0.7 ~ 7.4 ms

스터디원 블로그 - https://guiwoo.tistory.com/

java
열기
  • String [] input  =  x.split(" ") 를 이용하면 구분자 공백을 이용해서 찢은 배열을 반환 가능하다.
  • 시간을 분 단위로 바꾸는 메서드를 따로 빼서 푸니까 깔끔하게 풀 수 있다.

 

 

 

3. 행렬 테두리 회전하기 - lv 2

09-07 수

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/77485

 

프로그래머스

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

programmers.co.kr

 

  Sol) 배열 이용

java
열기
  • rotate라는 메서드를 이용해서 정해진 범위의 테두리에 값을 바꿔준다. 
    • rotate가 끝나면 answer에 최솟값을 업데이트해준다.
  • 여기에서 값이 바뀌기 시작하는 부분 [startRow][endCol]를 저장해서 [startRow + 1][endCol]에 값을 별도로 넣어줘야한다.
  • 문제에서 시계 방향으로 회전하는데 이대로 값을 넣지 말고 시계 반대 방향으로 값을 넣어줘야 정확하게 들어간다.
  • 배열을 복사한 cloneArr()을 새로 만들어서 활용한다.
  • 테두리 내에서 최솟값을 얻기 위해 min을 업데이트하면서 구하도록 한다.
    • 상 하 좌 우를 돌면서 모두 최솟값 체크를 한다.
  • 풀이에서 idx와 answer를 static으로 쓰고 있기 때문에 이에 대한 초기화가 꼭 필요하다.

 

  cf) 리스트

java
열기

 

  Sol) Gyu -PQ 이용

java
열기

  • PQ를 이용했는데 속도는 좀 걸리는 편이다.
  • PQ대신에 Math.min()을 이용하면 더 빨라진다.