전체 글 161

[프로그래머스/자바] 행렬의 곱셈_12949

문제 및 코드 1. 생각 // 생각 // 행렬의 곱은 한 행렬의 행과 다른 행렬의 열을 각각 곱한 값 // 구현 // 주어진 arr1과 arr2의 길이를 바탕으로 정답 배열을 선언한다 // 첫 번째 for문에서 arr1의 열만큼 돈다 // 두 번째 for문에서 arr2의 행만큼 돈다 2. 회고 행렬의 곱셈을 어떻게 하는지 생각이 안 나서 참고함.. 그리고 이중 for문까지는 생각이 났는데 삼중 for문은 생각이 안 났음 삼중 for문의 인덱스가 아직 잘 이해가지 않음 3. 기억 행렬의 곱은 기역(ㄱ)자로 곱하면서 이루어진다. 2행 3열 * 3행 2열 이렇게 한 행렬의 열과 다른 행렬의 행이 같아야 곱셈 가능. 이 행렬 곱셈의 결과는 2행 2열 4. 체크 풀이 횟수 시간 참고 여부 정답 여부 1 1시간 O X

코딩테스트 2023.08.08

[프로그래머스/자바] n^2 배열 자르기_87390

문제 및 코드 1. 생각 맨 처음에 2차원 배열 만들고 그걸 1차원으로 바꾼 후 추출하려고 했는데 도저히 안 돼서 찾아보니 어차피 저렇게 하면 시간 초과 난다고 하더라.. 2. 회고 위와 같이 생각해서 풀려고 했지만 시간 초과 난다고 했음. 그래서 다시 조건 살펴보니 n이 너무 커서 for문 돌면 복잡도가 너무 커질 것 같다는 생각을 하게 됨. 도저히 다른 방법은 생각이 안 나서 찾아봤더니 배열의 index를 나눈 몫과 나머지 중 큰 값에 1을 더하면 해당 배열에 들어갈 값을 구할 수 있다고 함. 해보니 되긴 하는데 어떻게 이런 생각을 해낼 수 있는지... 아직 이해가 잘 가진 않음. 그리고 long과 int 사이 형 변환을 언제 해야하는지 잘 파악을 못해서 좀 애먹음. 3. 기억 long -> int ..

코딩테스트 2023.07.28

[프로그래머스/자바] H-Index_42747

문제 및 코드 1. 생각 // 생각 // citations 정렬 후 반복문 돌기 // 구현 // h-index 최댓값은 citations의 길이부터 시작가능 // citations 정렬 // citations를 돈다(내림차순으로) // 각 값이 h-index보다 크거나 같으면 지금까지 count 1 증가 후 다음으로 // 각 값이 h-index보다 작으면 h-index와 count비교해서 다르면 종료 후 h-index 1 줄이고 다시 반복 // 각 값이 h-index보다 작으면 h-index와 count비교해서 같으면 해당 h-index 리턴 2. 회고 맨 처음에 위와 같은 생각을 가지고 풀었는데 딱 한 테케가 실패했다. 다른 테케들을 넣어봤지만 도저히 못 찾겠어서 다른 글들을 참고해보니 [4, 3, 3..

코딩테스트 2023.07.28

[프로그래머스/자바] 연속 부분 수열 합의 개수_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