코딩테스트/프로그래머스
[프로그래머스 Lv.1] JAVA 문자열, 수 2
머밍
2024. 7. 2. 15:46
가운데 글자 가져오기
class Solution {
public String solution(String s) {
String answer = "";
int len = s.length();
int i = len/2;
if(len % 2 ==1){
answer = s.charAt(i)+"";
} else{
answer = s.substring(i-1,i+1);
}
return answer;
}
}
- 다른 풀이 중 내 코드를 간단하게 구현했다.
wow..수학을 잘해보자,..,
class StringExercise{
String getMiddle(String word){
return word.substring((word.length()-1)/2, word.length()/2 + 1);
}
수박수박수박수박수박수?
- 처음엔 repeat함수를 쓰고싶었다.
class Solution {
public String solution(int n) {
String answer = "";
String jjak = "수박";
if(n%2==0){
answer = jjak.repeat(n/2);
} else{
answer = jjak.repeat(n/2);
answer += "수";
}
return answer;
}
}
- 위의 풀이과정에서 짝수 인덱스면 수, 홀수 인덱스면 박을 문자열에 추가하는게 나을 것 같아 구현했다.
class Solution {
public String solution(int n) {
String answer = "";
for(int i=0;i<n;i++){
answer += i%2==0 ? "수":"박";
}
return answer;
}
}
내적
오랜만의 내적
class Solution {
public int solution(int[] a, int[] b) {
int answer = 0;
for(int i=0; i<a.length; i++){
answer += a[i]*b[i];
}
return answer;
}
}
약수의 개수와 덧셈
약수의 개수가 홀수/짝수냐에 따라 덧셈,뺄셈이 정해짐
class Solution {
public int solution(int left, int right) {
int answer = 0;
for(int i = left; i <= right; i++) {
int sum = 0;
for(int j = 1; j <= i; j++) {
if(i % j == 0) sum ++;
}
if(sum % 2== 0){
answer += i;
}else{
answer -= i;
}
}
return answer;
}
}
- 다른 사람 풀이
제곱수인 경우 약수의 개수가 홀수임을 이용한 풀이다.
진짜 몰랐다.
class Solution {
public int solution(int left, int right) {
int answer = 0;
for (int i=left;i<=right;i++) {
//제곱수인 경우 약수의 개수가 홀수
if (i % Math.sqrt(i) == 0) {
answer -= i;
}
//제곱수가 아닌 경우 약수의 개수가 짝수
else {
answer += i;
}
}
return answer;
}
문자열 내림차순으로 배치하기
- 문제 풀이
- s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다
-> char 배열을 만든 후, Arrays.sort로 먼저 정렬해준다. - 이후 내림차순으로 즉, reverse해줘야한다. 이때 고민을 했는데, 문자열로 반환하니까 단순하게 StringBuilder를 사용했다. chars가 배열이기 때문에 String 객체로 만들었다.
import java.util.Arrays;
class Solution {
public String solution(String s) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
StringBuilder sb = new StringBuilder(new String (chars));
sb.reverse();
return sb.toString();
}
}
부족한 금액 계산하기
class Solution {
public long solution(int price, int money, int count) {
long answer = 0;
long cur = 0;
for(int i=1; i <= count; i++) {
cur += price * i;
}
if(cur > money) {
answer = cur - money;
}
return answer;
}
}
문자열 다루기 기본
Character.isDigit(char ch)
ch가 0부터 9까지의 숫자인지 여부를 판별
-> 다른 문제 풀때 알고 있던 함수라 쉽게 풀었다.
class Solution {
public boolean solution(String s) {
boolean answer = true;
if(s.length()==4 || s.length()==6){
for(int i=0;i<s.length();i++){
if(!Character.isDigit(s.charAt(i))){
return false;
}
}
} else {
answer = false;
}
return answer;
}
}
- 정규 표현식 이용하기
s.split("[0-9]").length ==0
: 문자열 s에 숫자(0부터 9까지의 숫자)가 포함되어 있는지 여부를 판별
split("[0-9]"):문자열 s를 정규 표현식 [0-9]에 따라 분할. 숫자(0부터 9까지의 숫자)에 해당하는 모든 문자를 구분자로 삼아 문자열을 분리length ==0 : 즉 숫자로만 구성되어 있다면 배열의 길이는 0
class Solution {
public boolean solution(String s) {
boolean answer = true;
if (s.length() == 4 || s.length() == 6) {
if(s.split("[0-9]").length != 0){
return false;
}
} else {
// 길이가 4 또는 6이 아니면 false 반환
return false;
}
return answer;
}
}
직사각형 별찍기
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 = 0; i < b; i++) {
String s = "*".repeat(a);
System.out.println(s);
}
}
}
최대공약수와 최소공배수
최대공약수는 두 수 중 작은값부터 시작하여 검사.
- n % i == 0 && m % i == 0 조건은 i가 n과 m의 공약수인지 확인
-> 만족하면 i는 최대 공약수. - 두 수의 곱 / 최대 공약수 = 최소공배수
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
for(int i = Math.min(n,m); i > 0; i--) {
if( n % i == 0 && m % i == 0) {
answer[0] = i;
answer[1] = (n*m)/i;
break;
}
}
return answer;
}
}
3진법 뒤집기
10진수 -> 3진수 -> 뒤집기한 3진수 -> 10진수의 문제다.
뒤집은 3진법을 어떻게 만들까 고민이었다.
3진법을 만드는 과정에서 n을 3으로 처음 나눈 나머지가 맨 앞으로 가면 이게 바로 뒤집은 3진법을 만드는 방법이라는 것을 알게되어 이를 통해 구현했다.
-> +=를 이용해 문자열로 뒤에 이어서 나머지를 넣어주면 된다.
Integer.parseInt(문자열, 진수); -> 문자열을 정해진 진수의 정수로 나타낸다.
class Solution {
public int solution(int n) {
String str ="";
while(n!=0){
str += n % 3;
n /= 3;
}
return Integer.parseInt(str,3);
}
}
크기가 작은 부분 문자열
첫번째 풀이
제한사항
1 ≤ p의 길이 ≤ 18
제한 사항을 안보고 풀어서 런타임에러났다.........
레벨1이라고 조건 대충 넘어가지 말자!!!!!!!!!!!!!!!!!!
class Solution {
public int solution(String t, String p) {
int answer = 0;
int len = p.length();
int np = Integer.parseInt(p);
for(int i = 0; i < t.length()-len +1; i++) {
int num = Integer.parseInt(t.substring(i,i+len));
if(num <= np){
answer++;
}
}
return answer;
}
}
- 두번째 풀이
long으로 바꾸어 풀었다. 정답~
class Solution {
public int solution(String t, String p) {
int answer = 0;
int len = p.length();
long lp = Long.parseLong(p);
for(int i = 0; i < t.length()-len +1; i++) {
Long num = Long.parseLong(t.substring(i, i+len));
if(num <= lp){
answer++;
}
}
return answer;
}
}
이상한 문자 만들기
class Solution {
public String solution(String s) {
String answer = "";
String[] words = s.split("");
int cur = 0;
for(String str : words) {
if(str.contains(" ")){
cur = 0;
answer += " ";
continue;
}
cur++;
answer += cur % 2 == 0? str.toLowerCase() : str.toUpperCase();
}
return answer;
}
}
삼총사
삼중 for문으로 구현했고 배열의 첫번째부터 차례대로 하나씩 더한 값이 0인 개수를 찾는것이다.
따라서 이미 계산 된 경우는 세지 않는점을 이용했다.
number 예시: [-2, 3, 0, 2, -5]
i범위: -2~0 까지
j범위: 3~2까지
k범위: 0~-5까지
class Solution {
public int solution(int[] number) {
int answer = 0;
int len = number.length;
for (int i = 0; i < len -2; i++) {
for (int j = i+1; j <len -1; j++) {
for (int k = j+1; k < len; k++) {
int cur = number[i] + number[j] + number[k];
if(cur == 0){
answer++;
}
}
}
}
return answer;
}
}
최소직사각형
- 일단 가로는 두 변중 가장 큰 값으로 고정한다.
- 가로로 설정된 명함 빼고 나머지 명함들 중에 가장 짧은 부분을 세로로 정한다.
-> 처음에 회전때문에 머리가 아팠는데 생각해보니 회전의 뜻은 가로나 세로를 구분하지 않고 구해라라는 것 같다.
class Solution {
public int solution(int[][] sizes) {
int max_w = 0;
int max_h = 0;
for(int i = 0; i < sizes.length; i++){
int w = Math.max(sizes[i][0], sizes[i][1]);
int h = Math.min(sizes[i][0], sizes[i][1]);
//갱신
max_w = Math.max(max_w, w);
max_h = Math.max(max_h, h);
}
return max_w * max_h;
}
}