코딩테스트 49

[프로그래머스/자바] 연속 부분 수열 합의 개수_131701

문제 및 코드 1. 생각 // 생각 // 중복된 합 세면 안 되니까 집합 // // 구현 // 반복문 돌아야하는데 총 도는 횟수가 elements길이*(elements길이-1)+1이다 // 확인해야 하는 길이수만큼 반복문을 돈다(1개~elements길이) // 배열을 돌면서 위의 길이 안에 속하는 원소들의 합을 구한다 // 집합에 넣는다 2. 회고 3중 for문이 생각나긴 했는데 이게 맞나.. 라는 생각과 변수 설정이 헷갈려서 다른 풀이를 참고했다. dp도 있는 것 같긴 한데.. 원형 처리를 위한 부분도 생각나지 않았는데 배워감 3. 기억 배열이 주어졌을 때 원형 처리를 하기 위해서는 특정 값을 배열 길이로 나눈 나머지를 인덱스로 하면 원형으로 값을 탐색할 수 있다. 4. 체크 풀이 횟수 시간 정답 여부..

코딩테스트 2023.07.27

[프로그래머스/자바] 괄호 회전하기_76502

문제 및 코드 1. 생각 // 생각 // 괄호쌍 검사니까 스택 // 구현 // 괄호쌍 검사하는 부분을 함수로 따로 만들기 // 여는 괄호면 스택에 넣기 // 닫는 괄호인데 스택 비어있지 않으면 스택에서 꺼내서 일치하는지 확인 // 회전 // s의 길이만큼 돌기 // i부터 s길이만큼 substring한 결과 + 0부터 i 만큼 substring한 결과를 확인 2. 회고 괄호쌍 검사의 경우 처음에 조건 잘못 확인해서 오류가 났음. 괄호쌍 검사할 때 조건을 잘 확인하자 회전을 어떻게 시킬까 하다가 substring 메소드 이용해서 회전을 만들어내려고 하였음. 위의 생각대로 풀고 제출했더니 테스트 13이 통과되지 않았음 혹시 몰라서 "("을 입력값으로 넣은 테케를 만들어보니 이게 문제 괄호쌍 검사가 잘못 되었..

코딩테스트 2023.07.27

[프로그래머스/자바] 멀리 뛰기_12914

문제 및 코드 1. 생각 // 생각 // 1과 2를 배치한 합이 n을 만들 수 있는 모든 경우의 수를 구해야 함 // 조합의 느낌 // 구현 // 규칙이 피보나치 수열... // 피보나치 수열의 값을 재귀로 구해도 되고 dp로 구해도 된다 2. 회고 여러 경우를 살펴보니 조합과 순열의 기운이 느껴졌다. 그런데 조합과 순열 코드 작성이 잘 안 돼서 다른 코드를 참고했다. 그런데 n에 따른 결과가 피보나치 수열이라고 dp로 풀더라... 그래서 나도 dp로 풀었다 dp로 풀 생각을 맨 첨에 어떻게 하지..? 3. 기억 피보나치 수열을 dp로 풀 때 들어올 값이 1인 경우를 잘 고려해야 한다. 4. 체크 풀이 횟수 시간 정답 여부 참고 여부 1 25분 O

코딩테스트 2023.07.26

[프로그래머스/자바] N개의 최소공배수_12953

문제 및 코드 1. 생각 // 생각 // 두 수의 최소공배수 구하는 걸 반복 2. 회고 최소공배수 구하는 함수를 만든 후 배열에 있는 수끼리 최소공배수를 구해나가면 될 것이라고 생각함. 그래서 최소공배수 구하는 함수를 먼저 구현하고자 함. 약간의 시행착오가 있었지만 반복문을 사용해서 최소공배수 구하는 함수를 만들었음. 내가 구현한 방식은 소인수분해를 이용하여 구현한 방식이고 다른 방법도 있는 것 같음. 다른 방식 중 하나는 유클리드 호제법을 활용하는 것. 유클리드 호제법에 대한 설명은 알고리즘 글 참고. 3. 기억 유클리드 호제법 재귀로 구현 public static int gcd(int num1, int num2){ // num1 > num2 라고 가정 if(num2 == 0){ return num1;..

코딩테스트 2023.07.26

[프로그래머스/자바] 예상 대진표_12985

문제 및 코드 1. 생각 모양이 트리라 트리 문제인가 생각했다가... 그냥 list에 넣어서 처리해야 하나 생각했다가.. 2. 회고 list를 만들어서 거기에 사람들 넣어두고 삭제해 나가면서 확인하는 방식으로 반복문 2개 돌았는데 이상하게 한 건지 테케부터 시간초과가 떠서 다른 풀이를 참고했다 핵심은 모든 사람을 살펴볼 필요가 없고 a와b는 계속 이기니까 a와b의 대진 순서만 구하면 되는 것. 둘의 대진 순서가 결국 같아질때 답이 나오게 된다. 3. 체크 풀이 횟수 시간 정답 여부 참고 여부 1 40분 O

코딩테스트 2023.07.25

[프로그래머스] 영어 끝말잇기_12981

1. 생각 // 생각 // words 돌면서 맨 마지막 글자 저장하고 다음 단어 맨 처음이랑 아까 저장한 거 비교... // index 계산도 하고.. // 구현 // words를 돈다 // set에 현재 단어가 있다 // // set에 현재 단어가 없다 // set에 현재 단어 저장 // 해당 단어의 맨 첫 글자와 저장된 맨 마지막 글자가 같다 // 이번의 마지막 글자 저장 // 다음 턴으로 // 해당 단어의 맨 첫 글자와 저장된 맨 마지막 글자가 다르다 // 몇 번째 사람인지 구하고 // 몇 번째 턴인지 구함 2. 회고 기본적인 구현은 생각나는 대로 조건 잘 나누어서 for문 돌면서 확인하면 되었는데 현재 단어 말한 사람이 누구인지, 몇번째 차례인지 계산하는 과정에서 약간 생각을 해야 했다 현재 단어..

코딩테스트 2023.07.24

[프로그래머스] 짝지어 제거하기_12973

문제 및 코드 1. 생각 처음에는 자료구조없이 그냥 반복문 하나로 풀려고 했었다 2. 회고 맨 첫 풀이는 아래와 같았다 더보기 int start = 0; int end = 2; while(true){ if(start >= s.length() || end >= s.length()+1){ return 0; } String temp = s.substring(start, end); if(temp.charAt(0) == temp.charAt(1)){ s = s.replaceAll(temp, ""); if(s.equals("")){ return 1; } start = 0; end = 2; continue; } start += 1; end += 1; } 그런데 시간초과가 떠서 다른 방법으로 풀어야 함을 깨달았다. 스..

코딩테스트 2023.07.24

[프로그래머스] 피보나치 수_12945

문제 및 코드 1. 생각 // 생각 // 그냥 구현하면 될듯 // 구현 // n번째 피보나치 수를 구하는 함수를 만들기 // 위 함수의 결과를 1234567로 나눈 나머지를 리턴하기 재귀보다 메모이제이션이 낫다 2. 회고 n의 범위에 따른 피보나치 수열의 값을 고려하지 않고 무작정 재귀로 풀었더니 시간초과 오류가 났다. n이 엄청나게 큰 경우 그에 따라 피보나치 수열의 값도 엄청나게 커지는데 아마 그걸 int에 담을 수 없어서 1234567로 나눈 나머지를 저장해야 하지만 그걸 저장하는 부분을 재귀함수에 반영하지 않았다. 엄청 커지면 int, long으로도 표현 불가능한듯. 그래서.. 원래 풀었던 재귀함수에 1234567로 나눠 보려고 했는데 시간초과 계속 발생... 다른 풀이 참고해서 풀었다 3. 기억..

코딩테스트 2023.07.21

[프로그래머스] 다음 큰 숫자_12911

문제 및 코드 1. 생각 // 생각 // 그냥 냅다 구현... // 구현 // n을 2진수로 변환했을 때 1의 개수를 구한다 // while을 돈다 // n을 1 증가시킨 후의 n을 2진수로 변환한 후 1의 개수를 구한다 // 만약 위에서 구한 n의 1 개수와 1 개수가 같으면 break 정확성은 맞지만 효율성에서 틀림... 2. 회고 정확성은 맞는데 효율성은 틀림. 이런 부분이 가장 난감하다... while 돌면서 1씩 증가하면서 다 살펴봐서 그런걸까? 아니면 replaceAll 메소드가 시간을 많이 잡아 먹는 걸까? replaceAll을 없애고 그냥 2진수 String을 for문 돌면서 1의 개수를 세어주니 통과가 되었다... replaceAll의 시간복잡도는 O(n*m)이고 2진수 String을 f..

코딩테스트 2023.07.21

[프로그래머스] 이진 변환 반복하기_70129

문제 및 코드 1. 생각 // 생각 // 그냥 문자열 처리 잘 하면 될 것 같음 // 구현 // s가 1이 아닐 때 동안 while 돈다 // s에서 0을 다 공백으로 바꾼다 // 원래 s와 공백으로 바꾼후의 s의 길이의 차이를 누적 // s를 s의 길이를 이진수로 바꾼 걸로 변환 2. 회고 어렵지는 않았는데 String 관련 메소드가 생각 안 나서 참고했다... 기억해야지 3. 기억 String str = "aa"; str.replaceAll("a","b"); StringBuilder sb = new StringBuilder(); sb.append("aaaacc"); sb.reverse(); int num = 6; Integer.toBinaryString(num); // String 결과를 리턴 4. ..

코딩테스트 2023.07.21