알고리즘 315

[프로그래머스, 파이썬] 숫자 변환하기

풀이 값 비교를 계속 진행해야 하고 몇 번 작업을 했는지 확인해야 하기에 deque를 활용하여 해결하고자 했으며 처음에는 연산을 마친 값이 y보다 작거나 같을 경우만 해서 q에 추가하여 해결하고자 했지만 시간초과가 발생하여 어떻게 하면 좋을지 살펴본 결과 방문 표시를 하면 되었기에 해쉬로 값을 찾는 집합 형태로 visit를 만들어 연산 값이 지난 번에 작업하지 않은 값의 경우만 q에 추가하도록 하여 해결. from collections import deque def solution(x, y, n): if x == y: return 0 visit = {x} q = deque([[x+n,1],[x*2,1],[x*3,1]]) while q: val,cnt = q.popleft() if val == y: ret..

알고리즘 2024.03.22

[프로그래머스, 파이썬] 롤케이크 자르기

풀이 처음 접할때는 두 번째 풀이와 같이 작성하면서도 시간 초과가 발생할 것 같았다. 다만 해당 방법 이외에 어떻게 접근해야 할지 잘 떠오르지 않아서 힌트를 확인해보았는데 지금까지는 비교 대상에 대한 구조를 동일하게 하는 것을 습관으로 여겼다. 예를 들어 배열이면 배열끼리, 딕셔너리면 딕셔너리, 집합이면 집합끼리 식으로. 그런데 해당 힌트는 딕셔너리와 집합을 활용하면 된다고 하기에 처음에는 어떤 방법인지에 대해 생각을 해봤는데 딕셔너리에서 topping 요소를 하나씩 차감하는데 이때 값이 더이상 존재하지 않을 경우엔 딕셔너리 자체에서 key값을 제거하고 반복문을 돌때마다 해당 토핑을 철수라는 집합에 추가하게 되면 문제를 해결할 수 있다. from collections import Counter def s..

알고리즘 2024.03.22

[프로그래머스, 자바] 약수의 합

풀이 간단한 문제이지만 알지 못했던 자바 메서드를 사용했기에 정리하려 포스팅. 파이썬에서는 int(x**(1/2))와 같이 작성하면 되는걸 자바에서는 어떻게 작성해야하나 싶었는데 우선 Math.sqrt(x)를 넣어주게 되면 되고 이걸 Math.floor() 에 넣어줘서 소수 부분을 버리기. 이후 (int)로 정수화 시켜 해결. 그리고 만약 (1/2)가 아닌 가변의 값이라면 어떻게 해야하는지 궁금해서 찾아보니 Math.pow()로 첫 번째 인자로 x를 넣고, 두 번째 인자로 원하는 값을 넣는 건데 이때 모든 인자의 값은 정수가 아닌 실수로 넣어줘야 한다는 것을 주의하기 해결 코드 아래에 Math.pow()적용 법에 대한 코드 또한 함께 첨부. class Solution { public int solutio..

알고리즘 2024.03.20

[프로그래머스, 자바] 자릿수 더하기

풀이 단순하게 10으로 나눈 나머지를 계속 더하는 방법도 있지만 자바에 대해 익숙해지기 위해 형변환을 하여 값을 추가하고자 해서 아래와 같이 해결했는데 해결 과정에서 파이썬의 range(시작, 끝)과 같은 걸 for-each로 접근하고 싶었는데 잘 되지 않아 찾아본 결과 stream을 사용하면 되어 두 번째 해결 방법처럼 하면 해결이 된다. 아 그리고 charAt()으로 문자를 가져온 다음 변형하려면 String.value()로 형변환은 한 번 더해야함. import java.util.*; public class Solution { public int solution(int n) { int result = 0; String s_n = String.valueOf(n); for (char num: s_n.t..

알고리즘 2024.03.20

[프로그래머스, 자바] 유한소수 판별하기

풀이 우선 기약분수와 소인수에 대한 정의를 한 번 하고 가자면 기약분수란? 분자와 분모의 공약수가 1로만 이루어져 있는 분수. 소인수란? 주어진 자연수를나누어 떠러뜨리는 약수 중 소수(1)인 약수이기에 해당 문제는 우선 a와 b를 기약분수로 만드는 것부터 접근을 했다. 그래서 s가 e보다 커지기 전까지 while문을 돌렸고 의미 없이 반복하기 보단 마지막을 a로 지정하고 a가 줄어들면 e 또한 함께 줄여 시간을 단축하고자 했으며 이후 분모가 2와 5로만 나누어져서 현재 상태가 1일 경우인지 아닌지에 대한 판별하여 해결. class Solution { public int solution(int a, int b) { int s = 2; int e = a; while (s

알고리즘 2024.03.20

[프로그래머스, 자바] 문자열 밀기

풀이 StringBuilder를 사용해서 문자를 추가하고 초기화하여 해결. 여기서 기존 문자간의 비교는 equals() 메서드를 사용했지만 StringBuilder와의 문자열과의 비교는 equals()로는 안되고 contentEquals()로 해야 한다는 것을 알게 되었다. 그리고 초기화는 sb.delete()로 시작과 끝 인덱스 값을 넣어주기. 그런데 이렇게 풀지 않고 그냥 A를 두배로 늘려서 B가 어디에 있는지 indexOf()로 찾는 방법도 있어서 아래 두 번째 해결 방법으로 풀 수도 있음. class Solution { public int solution(String A, String B) { int ln = A.length(); StringBuilder sb = new StringBuilder(..

알고리즘 2024.03.19

[프로그래머스, 자바] 배열 만들기 2

풀이 해당 접근 방법은 l과 r 사이의 숫자 중 0 또는 5로 나누어 떨어지는 숫자를 찾고 해당 숫자를 String으로 변경 한 다음 charAt()으로 해당 인덱스의 문자가 0과 5로 이루어져 있는지 확인 후 아니라면 state 변경과 탈출 이후 state에 따라 값을 result에 추가하고 마지막으로 result가 비어있는지 확인 후 값을 반환하여 해결 import java.util.*; class Solution { public int[] solution(int l, int r) { ArrayList result = new ArrayList(); for (int i=l; i

알고리즘 2024.03.19

[프로그래머스, 자바] 특이한 정렬

풀이 파이썬으로 해결하면 정말 간단한 문제이고 간결한 코드로 해결되는데 역시 자바는 아직 익숙하지 않아 좀 코드가 긴 것 같다. 우선 해결 방법으로는 2차원 배열을 사용하던지, Map을 사용하면 좋을 것 같아서 그냥 HashMap을 사용하여 접근하기로 함 이후 n과 numlist에 있는 정수와의 차의 절댓값을 key로 하여 값이 있다면 기존 배열에 값을 추가하고 없다면 배열을 생성후 값을 추가하기로 함 이때 배열 생성하면서 초기값을 추가하고자 한다면 Arrays.asList()로 값을 추가하면 된다. 만약 여러 개의 값일 경우에도 콤마(,)를 적용해서 값을 더 추가하면 된다. 이후 dic에 있는 key 목록들을 조회하는 dic.keySet()을 정렬하기 위해 새롭게 배열을 생성 후 Collections로..

알고리즘 2024.03.19

[프로그래머스, 자바] 배열 자르기

풀이 해당 문제 또한 다양한 방법이 있었지만 처음 접근한 것은 Arrays.stream()에 특정 길이 만큼 자르는 방법이 있는지 몰라서 받아오는 배열의 타입과 같은 배열 하나를 return할 길이 만큼 생성 한 다음 for문을 활용하여 추가하여 해결했는데 자바에서도 Arrays.stream()을 활용하여 첫 인자로는 배열, 두 번째 인자로는 시작 위치, 세 번째 인자로는 마지막 위치를 넣어주고 다시 배열로 만들어주기 위해서 toArray() 메서드를 사용하여 해결. import java.util.*; class Solution { public int[] solution(int[] numbers, int num1, int num2) { return Arrays.stream(numbers,num1,num2..

알고리즘 2024.03.16

[프로그래머스, 자바] 배열 뒤집기, 문자열 뒤집기

풀이 해당 문제는 포스팅은 따로 작성한 이유는 방법에 대하여 포스팅을 해두면 기억을 오랫동안 할 수 있을 것 같아서 따로 포스팅을 하게 되었습니다. 우선 배열을 뒤집는 방법은 다양하게 있지만 자바는 파이썬 처럼 모든 배열을 reverse() 이렇게가 안되고, 타입에 따른 reverse()가 있기에 해당 문제로 받아오는 배열은 int[] 이었기에 int[] 타입의 배열을 따로 하나 더 만든 다음 Arrays.setAll()을 사용해서 변경하기로 했다. 첫 번째 인자로는 변경하고자 하는 배열, 두 번째 인자로는 인덱스를 넣어 주고 해당 메서드는 return값이 null 이기에 실행 후 변경된 배열을 return하여 해결 그리고 문자열 뒤집기의 경우엔 StringBuilder에도 reverse()가 있는지 모..

알고리즘 2024.03.16