30. x만큼 간격이 있는 n개의 숫자
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
long num = x;
for(int i=0; i<n; i++){
answer[i] = num + (i*num);
}
return answer;
}
}
<작성한 코드>
간단한 문제다. answer의 길이는 n만큼 선언해 주고 반복문으로 answer [i]에 각각의 x + (i*x)를 해준 뒤 대입해 줬다. x를 long형 num에 대입해 준 이유는 매개변수 x가 int형인데 큰 값이 들어오면 오버플로우가 생긴다. 그래서 long형 변수로 따로 만들어서 사용하였다.
31. 직사각형 별찍기
import java.util.Scanner;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
for(int i=1; i<=a*b; i++){
System.out.print("*");
if(i%a == 0){
System.out.println();
}
}
}
}
<작성한 코드>
간단한 문제다. 풀던 방식이 아닌 다른 방법으로 풀어보고 싶어서 for문으로 i는 1부터 a*b까지 별을 출력하게 한 뒤 내부에서 i% a가 0일 때 \n을 해줬다.
32. 소수 만들기
class Solution {
public int solution(int[] nums) {
int answer = 0;
for(int i=0; i<nums.length-2; i++){
for(int j=i+1; j<nums.length-1; j++){
for(int k=j+1; k<nums.length; k++){
int sum = nums[i] + nums[j] + nums[k];
if(real(sum)){
answer++;
}
}
}
}
return answer;
}
private boolean real(int num){
if(num < 2) return false;
for(int i=2; i<=Math.sqrt(num); i++){
if(num%i == 0) return false;
}
return true;
}
}
<작성한 코드>
우선 real 메서드를 만들었다. 소수 인지 판단하기 위해서 num이 2보다 작은 수면 바로 false를 리턴하고 아니라면 i는 2부터 제곱근(Math.sqrt())까지 반복해 주고 약수가 있다면 false를 리턴해준다. 만약 약수가 없다면 true를 리턴한다.
메인함수에서는 총 3개의 숫자를 반복해야 하니 for문을 3번 중첩해서 사용하였다. 그 뒤 숫자 세 개를 더해서 sum을 만들어주고 real(sum)을 해서 true, false를 확인했다. 만약 true라면 answer에 1을 더해준다. 그 후 마지막으로 answer를 반환해 주고 끝냈다.
33. 예산
import java.util.*;
class Solution {
public int solution(int[] d, int budget) {
int answer = 0;
Arrays.sort(d);
for(int i=0; i<d.length; i++){
budget -= d[i];
if(budget < 0){
break;
}
answer ++;
}
return answer;
}
}
<작성한 코드>
정수형 배열 d를 오름차순으로 정렬해 준 뒤 for문을 사용해서 보유자산 - 지원금액을 빼줬다. 만약 지원금액이 -가된다면 for문을 멈춘다. 0보다 크다면 answer에 1씩 더해줬다. 그 뒤 answer을 반환해 줬다.
34. [1차] 비밀지도
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for(int i=0; i<n; i++){
int map = arr1[i] | arr2[i];
String map2 = Integer.toBinaryString(map);
while(map2.length() < n){
map2 = "0" + map2;
}
map2 = map2.replaceAll("1", "#");
map2 = map2.replaceAll("0", " ");
answer[i] = map2;
}
return answer;
}
}
<작성한 코드>
#이 하나라도 있으면 #이고 둘 다 공백이면 공백이라는 걸 보면 OR연산을 해주면 된다. 그래서 for문을 사용해서 n번까지 반복해 주고 내부에서는 int형 변수 map에 arr1 [i]와 arr2 [i]의 OR연산을 해줬다. 그 뒤 문자열 변수 map2에 정수형 변수 map을 2진수로 변환해 줬다. 현재 5자리가 나와야 하기 때문에 while문을 사용해서 map2의 길이가 n보다 짧다면 n과 같아질 때까지 map2의 앞에 0을 추가해 줬다. 그 뒤. replaceAll을 사용해서 map2 내부에 있는 1은 #으로 0은 공백으로 변경했다. 그 뒤 answer [i]에 계산된 map2값을 넣으면 된다. 마지막으로 answer을 반환해 줬다.
'프로그래머스 문제풀이 > 알고리즘 (JAVA)' 카테고리의 다른 글
남건욱's 공부기록