Programmers #23

이강용·2023년 6월 26일
0

Programmers

목록 보기
22/58

가운데 글자 가져오기

📑 문1) 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.


제한 사항

  • s는 길이가 1 이상, 100이하인 스트링입니다.

입출력 예

sreturn
"abcde""c"
"qwer"we

나의 풀이

package programmers;

public class MeddleLetter {
	
	public static String solution(String s) {
        
        return (s.length() % 2 == 0) ? s.substring(s.length() / 2 - 1 , s.length() / 2 + 1) : 
        	s.substring(s.length() / 2 ,s.length() / 2 + 1);
	}
	
	public static void main(String[] args) {
		solution("qwer");
	}

}

나의 생각

매개변수로 주어지는 문자s의 길이를 체킹하여, 나누기 2 즉, 길이가 Odd 또는 Even인지를 판별하여, 홀수이면 가운데 문자를 , 짝수이면 가운데 두 개의 문자를 리턴하는 방법을 사용하였다.


수박수박수박수박수박수?

📑 문2) 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.


제한 사항

  • n은 길이 10,000이하인 자연수입니다.

nreturn
3수박수
4수박수박

나의 풀이

package programmers;

public class Watermelon {
	
	public static String solution(int n) {
       StringBuilder sb = new StringBuilder();
       
       for(int i = 1; i <= n; i++) {
    	   if(i % 2 == 1) {
    		   sb.append("수");
    	   }else {
    		   sb.append("박");
    	   }
       }
        return sb.toString();
    }
	
	
	public static void main(String[] args) {
		solution(50);
	}
}


나의 생각

매개변수로 주어지는 n나누기 2 하여 나온 나머지의 값에 따라(0 또는 1) 홀, 짝으로 나누어, "수","박" 글자를 더하여 간단하게 해결.

번외

처음에 들었던 생각 중에... 이렇게도 될까 라고 생각한것이... 제한사항으로 주어진 n의 크기 10,000 을 전체 String answer = "수박 X 5,000" 실행하여 subString() 메서드를 쓰면 되지않을까 라고 생각했다가... 이런 하드 코딩이 또 어디 있을까 , 웃으면서 넘겼는데 다른 분의 풀이 중에... 놀랍게도 같은 풀이가 존재했다....

class Solution {
    String text ="수박 x 5,000 ...(반복)";
  public String solution(int n) {
      String answer = text.substring(0, n);
      return answer;
  }
}

내적

📑 문3) 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)


제한 사항

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

입출력 예

abresult
[1,2,3,4][-3,-1,0,2]3
[-1,0,1][1,0,-1]-2

입출력 예 설명

  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.

  • a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.


나의 풀이

package programmers;

public class DotProduct {
	
	public static int solution(int[] a, int[] b) {
        int answer = 0;
        
        for(int i = 0; i < a.length; i++) {
        	answer += a[i]*b[i];
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		int[] a = {1,2,3,4};
		int[] b = {-3,-1,0,2};
		
		solution(a, b);
	}

}

나의 생각

내적이라는 수학적 표현식은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 뭔가 어려워 보이지만, 규칙이 있기때문에 이 규칙성만 찾으면 쉽게 해결할 수 있는 로직이였다. 매개변수로 주어지는 a,b 배열의 크기는 동일하기때문에, 반복문을 통해, answer에 해당 index의 결과를 더해주면 쉽게 해결할 수 있었다.


약수의 개수와 덧셈

📑 문4) 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.


제한 사항

  • 1 ≤ leftright ≤ 1,000

입출력 예

leftrightresult
131743
242762

입출력 예 설명

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것이다.
약수약수의 개수
131, 132
141, 2, 7, 144
151, 3, 5, 154
161, 2, 4, 8, 165
171, 172
  • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 한다.

입출력 예 #2

  • 다음 표는 24부터 27까즈이 수들의 약수를 모두 나타낸 것이다.
약수약수의 개수
241, 2, 3, 4, 6, 8, 12, 248
251, 5, 253
261, 2, 13, 264
271, 3, 9, 274
  • 따라서, 24 - 25 + 26 + 27 = 52를 return해야 한다.

나의 풀이

package programmers;

import java.util.ArrayList;

public class NumberOfFactorsAndAddition {
	 public static int solution(int left, int right) {
	        int answer = 0;
	        int cnt = 0; 
	        ArrayList<Integer> factors = new ArrayList<>();
	      
	        for(int i = left; i <= right; i++) {
	        		while(cnt <= i) {
	        			cnt++;
	        			if((i % cnt) == 0) {
	        				factors.add(cnt);
	        			}		
	        		}
	        		if(factors.size() % 2 == 0) {
	        			answer +=i;
	        		}else {
	        			answer -=i;
	        		}
	        		factors.clear();
	        		cnt = 0;
	        }
	        return answer;
	    }
	 
	 public static void main(String[] args) {
		solution(24, 27);
	}
}

나의 생각

나는 List를 하나 만들어, 반복에서 해당 Listsize가 ₩짝수이냐홀수` 이냐에 따라서, 문제를 해결하였는데, 나와 같이, List에 어떤 약수가 들어 있는지 확인하고 싶은 경우가 아니라면 다음과 같이 문제를 풀 수 있을것 같다.

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        for(int i = left; i<=right; ++i){
            int count = 0;
            for(int j=1; j<=i; ++j)
                if(i%j == 0)
                    count++;

            if(count % 2 == 0)
                answer += i;
            else
                answer -= i;
        }
        return answer;
    }
}

두 번의 for문 반복으로 i가j와 같을 때 약수를 checking하여 약수의 갯수를 판별할 수 있다.


제곱수의 활용한 방법

  • 내가 풀이한 방법을 잘 보면, 제곱수인 경우 약수가 홀수개로 존재하는 것을 알 수 있다. 예를들어

    24 : 1,2,3,4,6,8,12,24 로 짝수 개의 약수가 존재
    25 : 1,5,25로 홀수 개의 약수가 존재
    26 : 1,2,13,26로 짝수 개의 약수가 존재
    27 : 1,3,9,27로 짝수 개의 약수가 존재

  • 이를 로직화 하면 다음과 같다.

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;
    }
}

문자열 내림차순으로 배치하기

📑 문5) 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.


제한 사항

  • str은 길이 1 이상인 문자열입니다.

입출력 예

sreturn
"Zbcdefg"``"gfedcbZ"

나의 풀이

package programmers;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CharacterDescendingOrder {
	public static String solution(String s) {
		
        String[] ch = s.split("");
        
        ArrayList<String> list = new ArrayList<>();
        for(String a : ch) {
        	list.add(a);
        }
        
        Collections.sort(list, Comparator.reverseOrder());
        
        String answer = String.join("", list);
       
        System.out.println(answer);
        return answer;
    }
	
	public static void main(String[] args) {
		solution("Zbcdefg");
	}

}

나의 생각

정렬 하는 방법에는 여러가지가 존재하지만, 나는Collections 클래스의 sort메서드를
활용하는 방법을 사용하였다. Collections 클래스의 sort 메서드안에는 오름차순내림차순 으로 변환하는 reverseOrder() 가 존재하기 때문에 쉽게 변환이 가능하다는 이점이 있다. 그리고 String answer = String.join("",list)를 사용하였는데 String.join() 메서드의 사용법을 보면 다음과 같다.

Sting.join(구분 문자열, 문자열 시퀸스)

따라서, list의 모든 요소가 그대로 이어져 하나의 문자열이 된다.


다른 풀이

package programmers;

import java.util.Arrays;

public class CharacterDescendingOrder {
	public static String solution(String s) {
        char[] ch = s.toCharArray();
        Arrays.sort(ch);
       
        StringBuilder sb = new StringBuilder();
        sb.append(ch);
        
        return sb.reverse().toString();
    }
	
	public static void main(String[] args) {
		solution("Zbcdefg");
	}

}

나의 설명

매개 변수로 문자열 s를 입력받는데, 입력받은 문자열 s를 문자 배열 ch로 변환하고, 그 배열을 정렬한다. 그리고 StringBuilder를 사용하여 문자 배열을 다시 문자열로 변환하고, 이문자열을 역순(오름차순 -> 내림차순)으로 정렬한다.


profile
HW + SW = 1

0개의 댓글