64. 기사단원의 무기

class Solution {
public int solution(int number, int limit, int power) {
int answer = 0;
for(int i=1; i<=number; i++){
int cnt = 0;
for(int j=1; j*j<=i; j++){
if(j*j == i) cnt++;
else if(i%j == 0) cnt+=2;
}
if(cnt > limit) cnt = power;
answer += cnt;
}
return answer;
}
}
<작성한 코드>
간단한 문제였지만 약수 구하는 부분에서 시간복잡도를 생각해야 되는 문제였다. 반복문을 사용해서 i의 약수를 구하기 위해 약수 개수를 저장할 정수형 변수 cnt를 선언했다. 그 뒤 for문을 사용해서 j는 1부터 j의 제곱근이 i보다 크지 않을 때까지 반복시켰다. 그 뒤 if문을 사용해서 제곱근이 i와 같으면 cnt를 1 증가시키고, i% j의 나머지가 0이라면 cnt에는 2를 증가시켰다. 2를 증가시킨 이유는 한쌍이기 때문이다. j와 num/j가 약수로 추가된다.
65. 명예의 전당(1)

import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
List<Integer> list = new ArrayList<>();
for(int i=0; i<score.length; i++){
list.add(score[i]);
Collections.sort(list, Collections.reverseOrder());
if(i < k-1){
answer[i] = list.get(list.size()-1);
} else{
answer[i] = list.get(k-1);
}
}
return answer;
}
}
<작성한 코드>
간단한 문제였다. answer의 길이는 score의 길이와 동일하게 선언해 주고 반복문을 score의 길이만큼 돌렸다. list에 score의 값을 차례대로 넣은 뒤 Collections.sort를 사용해서 오름차순으로 정렬 후 Collections.reverseOrder()를 사용해서 역순으로 정렬해 줬다. 내림차순으로 정렬된 list를 가지고 if문을 사용해서 조건을 걸었다. 만약 i가 명예의 전당이 꽉 차기 전이라면 list에서 제일 작은 수인 마지막숫자를 가져와서 answer에 더한다. 만약 명예의 전당이 꽉 찼다면 k-1번째가 명예의 전당의 수중 제일 작은 수일테니 list.get(k-1) 값을 answer [i]에 넣어줬다. 그 뒤 answer을 반환하였다.
66. 문자열 나누기

class Solution {
public int solution(String s) {
int answer = 1;
char ch = s.charAt(0);
int cnt = 1;
for(int i=1; i<s.length(); i++){
if(cnt == 0){
answer++;
ch = s.charAt(i);
}
if(ch == s.charAt(i)){
cnt++;
} else{
cnt--;
}
}
return answer;
}
}
<작성한 코드>
answer을 1로 잡고 시작하였다. 이유는 첫 글자가 시작할때부터 이미 1개의 문자열로 생각하려 했기 때문이다. 그 뒤 ch에 s의 첫 글자를 넣어주고 cnt에는 1로 초기화를 해줬다. 그 뒤 for문으로 s의 길이만큼 반복해 줬다. for문 내의 if문중 두 번째 if문부터 설명하자면 기존에 선언해 둔 ch가 i번째 문자와 같으면 cnt를 더하고, 같지 않다면 cnt를 빼준다. 이렇게 해서 cnt가 0이 된다면 answer에 1을 더해주고 ch를 새로운 i번째 문자로 초기화해 줬다. 그 뒤 answer의 값을 반환해 줬다.
67. 가장 가까운 같은 글자

import java.util.*;
class Solution {
public int[] solution(String s) {
int[] answer = new int[s.length()];
Map<Character, Integer> map = new HashMap<>();
for(int i=0; i<s.length(); i++){
char ch = s.charAt(i);
if(!map.containsKey(ch)){
answer[i] = -1;
map.put(ch, i);
} else{
answer[i] = i - map.get(ch);
map.put(ch, i);
}
}
return answer;
}
}
<작성한 코드>
간단한 문제였다. 우선 HashMap을 하나 만들어줬다. key값은 문자, 벨류값은 정수형으로 선언해 줬고 그 뒤 for문을 사용해서 s의 길이만큼 반복해 줬다. char형 변수 ch에 s의 i번째 글자를 초기화해준 뒤, 만약 map안에 ch를 키로 갖는 값이 없으면 answer에는 -1을 넣고 ch를 키값으로 인덱스값인 i를 넣어줬다. 만약 map에 ch를 키로 갖는 값이 있다면 answer에는 현재 인덱스인 i값에서 map에 들어있는 값을 빼줌값을 넣어줬고 키값인 ch에 현재 인덱스값인 i를 넣어줬다. 그 뒤 answer을 반환하였다.
68. 크기가 작은 부분 문자열

class Solution {
public int solution(String t, String p) {
int answer = 0;
int num = p.length();
for(int i=0; i<=t.length()-num; i++){
String result = t.substring(i, i+num);
if(Long.parseLong(p) >= Long.parseLong(result)){
answer++;
}
}
return answer;
}
}
<작성한 코드>
간단한 문제였다. 정수형 변수 num에 p의 길이를 초기화해 줬다. 그 뒤 for문을 사용해서 t의 길이에서 num을 뺀 값까지 반복시켰고 문자열 변수 result에는 문자열 t에서 i번째부터 i+num번째의 문자까지 잘라서 저장해 줬다. 그리고 Long.parseLong()을 사용해서 long형으로 p와 result를 변환시킨 뒤 p의 값이 result보다 크거나 같으면 answer에 1을 더해줬다. 그 뒤 answer을 반환하였다.
'프로그래머스 문제풀이 > 알고리즘 (JAVA)' 카테고리의 다른 글
남건욱's 공부기록