목차
▸ 덧칠하기
▸ 기사단원의 무기
▸ 로또의 최고 순위와 최저 순위
출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 덧칠하기
[오답 코드]
import java.util.List;
import java.util.ArrayList;
class Solution {
public List<Integer> solution(int n, int m, int[] section) {
int answer = 0;
List<Integer> paintList = new ArrayList<>();
//초기 paintList 세팅
for(int i = 0; i < n; i++){
paintList.add(0);
}
//칠해야 할 부분 1로 처리하기
for(int i : section){
paintList.set(i-1, 1);
}
//칠한 부분 0으로 처리하기
for(int i = 0; i < paintList.size(); i++){
if(paintList.get(i) == 1){
for(int j = i; j < i + m; j++){
paintList.set(j, 0);
answer++;
}
}
}
return paintList;
}
}
[수정 코드]
import java.util.List;
import java.util.ArrayList;
class Solution {
public int solution(int n, int m, int[] section) {
int answer = 0;
int startpoint = 0;
List<Integer> paintList = new ArrayList<>();
//초기 paintList 세팅
for(int i = 0; i < n; i++){
paintList.add(0);
}
//칠해야 할 부분 1로 처리하기 및 페인트칠 시작점 구하기
for(int i : section){
paintList.set(i-1, 1);
if(i+m-1 <= n){
startpoint = i-1;
}
}
//페인트칠 0으로 처리하기
for(int i = startpoint; i < startpoint + m; i++){
paintList.set(i, 0);
}
answer++;
//페인트칠 이전에 1이 남아있는지 확인하고 남아있으면 페인트칠
for(int i = 0 ; i < startpoint; i++){
if(paintList.get(i)==1){
for(int j = i; j < i+m; j++){
paintList.set(j, 0);
}
answer++;
}
}
return answer;
}
}
[통과 코드]
class Solution {
public int solution(int n, int m, int[] section) {
int answer = 0;
int painted = 0;
for(int point : section){
if(point > painted){
answer++;
painted = point + m -1;
}
}
return answer;
}
}
❗️문제의 처리방법과 유사한 메서드를 실행하지 않아도 된다. 쉽게 생각하기!
출처: 코딩테스트 연습 > 연습문제> 기사단원의 무기
import java.util.List;
import java.util.ArrayList;
class Solution {
public int solution(int number, int limit, int power) {
int answer = 0;
List<Integer> list = new ArrayList<>();
for(int i = 1; i <= number; i++){
//약수의 수 구하기
int count = 0;
for(int j = 1; j <= i; j++){
if(i%j==0){
count++;
}
}
list.add(count);
}
//limit 넘은 숫자 처리하기 와 합 구하기
for(int i = 0; i < list.size(); i++){
if(list.get(i) > limit){
list.set(i, power);
}
answer += list.get(i);
}
return answer;
}
}
❗️약수를 구하는 최적의 방법 (시간 단축)
✓ number의 약수가 1일 때, 그 짝으로 다른 약수는 number/1이다.
✓ number의 약수가 i일 때, 다른 약수는 number/i가 된다.
✓ 약수의 수가 홀수인 경우는 제곱근이 포함되어있는 경우다.int number = 199999999; int count = 0; for(int i = 1; i*i <= number; i++){ if(i * i == number){ count ++; } else if(number % i == 0){ count += 2; }
[수정 코드]
class Solution {
public int solution(int number, int limit, int power) {
int answer = 0;
int[] array = new int[number];
for(int i = 1; i <= number; i++){
//약수의 수 구하기
int count = 0;
for(int j = 1; j * j <= i; j++){
if(j * j == i){
count++;
} else if(i % j == 0){
count += 2;
}
}
array[i-1] = count;
}
//limit 넘은 숫자 처리하기 와 합 구하기
for(int i = 0; i < array.length; i++){
if(array[i] > limit){
array[i] = power;
}
answer += array[i];
}
return answer;
}
}
출처: 프로그래머스 코딩테스트 연습 > 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 로또의 최고 순위와 최저 순위
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[2];
int cnt = 0;
int zerocnt = 0;
//0을 제외하고 당첨 번호와 일치하는 숫자 세기
for(int number1 : lottos){
for(int number2 : win_nums){
if(number1 == number2){
cnt++;
}
}
if(number1 == 0){
zerocnt++;
}
}
//최고순위는 0이 원래의 당첨 번호인 경우, 최저순위는 0이 다 당첨 번호가 아닌 경우
int highcnt = cnt + zerocnt;
int lowcnt = cnt;
int highrank = 0;
int lowrank = 0;
//순위매기기
if(highcnt == 6){
highrank = 1;
} else if(highcnt ==5){
highrank = 2;
} else if(highcnt ==4){
highrank = 3;
} else if(highcnt ==3){
highrank = 4;
} else if (highcnt ==2){
highrank = 5;
} else {
highrank = 6;
}
if(lowcnt == 6){
lowrank = 1;
} else if(lowcnt ==5){
lowrank = 2;
} else if(lowcnt ==4){
lowrank = 3;
} else if(lowcnt ==3){
lowrank = 4;
} else if (lowcnt ==2){
lowrank = 5;
} else {
lowrank = 6;
}
answer[0] = highrank;
answer[1] = lowrank;
return answer;
}
}