3/15 정리

안대륜·2022년 3월 16일

21. 이상한 문자 만들기

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항

문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.


입출력 예


입출력 예 설명

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.


  • 생각해야 할것
    공백까지도 인덱스위치값에 포함되어있음
    공백을 포함한 인덱스위치값이 짝수이면 대문자 , 홀수이면 소문자로 변환해주어야한다.

1번풀이

class Solution {
    public String solution(String s) { // s는 한개이상의단어
// 각단어는 하나이상의 공백문자 , 각단어의 짝수번째알파벳은 대문자, 홀수번쨰 알파벳은 소문자로 바꾼 문자열리턴
        String answer = "";
        String[] str = s.split("");
        int idx =0;
        for (int i=0; i<str.length; i++) {
            if (str[i].equals(" ")) {
                idx=0;
            } else if(idx % 2 ==0) {
                str[i] = str[i].toUpperCase();
                idx++;
            } else if(idx % 2 != 0) {
                str[i] = str[i].toLowerCase();
               idx++;
            }
        answer += str[i];
                }
        return answer;
    }
}
  • 풀이
    int idx =0; 으로문자열 인덱스를 구분할 변수를 선언한다
    String[] str =s.split("");을 통해 입력받은 문자열을 스프릿을 활용하여 한 글자씩 String배열에 담는다.
    반복문을 통해 공백을 먼저 처리하고 문자열중에서 공백을 만나면 idx를0으로 초기화시킴
    (이러면 각 단어마다 정확한 짝수, 홀수번째를 구분할 수 있다.)
    만약 공백이 아니라면 이단어가 짝수번째인지 홀수번째인지 계산하고 짝수번째면 대문자로 변경하고 toUpperCase() idx++; 를해주고 홀수면 반대로해준다
    여기까지 한 글자 처리를 완료하면 answer 변수에 담는다
    이런식으로 문자열 s를 처리하면 answer를 리턴한다.

2번풀이

class Solution {
  public String solution(String s) {

        String answer = "";
        int cnt = 0;
        String[] array = s.split("");

        for(String ss : array) {
            cnt = ss.contains(" ") ? 0 : cnt + 1;
            answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase(); 
        }
      return answer;
  }
}
  • 풀이
    1번 내용과 비슷하며 삼항연산자를 이용해서 코드를 간결히 했다.

22. 자릿수 더하기

자릿수 더하기
문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한사항
N의 범위 : 100,000,000 이하의 자연수
입출력 예

입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.

  • 생각해야할것
    입력값의 정수를 하나하나씩 들고와서 각각 더해준다.
public class Solution {
    public int solution(int n) {
    int answer =0;
    while (n > 0) {
    answer += n%10; 
    n/=10;
    }
    return answer;
    }
    }
  • 풀이
    결과값을 담을 변수를 선언해주고 와일문을 통해 n이 0보다크면 n에 10을 나눈값을 answer에 담아준다 (그러면 123이 입력값이라고하면 3이나머지가되어서 일의자리를 알수있게되고 123의10나눈 몫은 12이가된다)
    12값을 가진n이 다시 반복문을 돌아 12 %10의 나머지는 2이가 되므로 2를 또더해주고 12의10나눈 몫은 1이되어서 다시 반복문을 실행하고 1 %10의 나머지는 1이되고 1 나누기 10의 몫은 0되서 반복문이 종료된다.

23 . 자연수 뒤집어 배열로 만들기

  • 생각해야할것
    n을 입력받으면 long에서 스트링타입으로 변환 시켜준다음에 스트링빌더로 순서를 바꿔준다

풀이방법 1 ⭐️

class Solution {
  public int[] solution(long n) {
  // long -> String 
  String s =String.valueOf(n);
 //reverse 메소드를 사용하기위해 스트링빌더 인스턴스생성
 StringBuilder sb = new StringBuilder(s);
 // 문자열뒤집기
 sb = s.reverse();
 String[] stirngArr =sb.toStirng().split("");
 //문자열 길이 만큼 배열 길이 할당
 int[] answer = new int[sb.length()];
 
 // String -> int -> int[]
 for (int i=0; i < sb.length(); i++) {
 answer[i] = Integer.parseInt(stringArr[i]);
 }
 return answer;
 }
 }
  • 풀이
    1 . 롱에서 스트링으로 타입을 변환시켜주고 하나의 문자열로 되있으면 수정이 불가능하기때문에 스트링빌더 인스턴스를 생성해서 순서를 바꿀수 있게 해준다
    (앞에서 스트링타입으로 변환은 시켜주었지만 수정후 결과를 반환할때는 다시 원래 형태로 갖다놔야한다)
    2 . sb = s.reverse();를 통해 문자열을 뒤집어준다
    3 . String[] stringArr = sb.toString().split을통해 배열을 쪼개서 stringArr값에 넣어준다
    4 . int[] answer = new int[sb.length()]; 로 문자열 길이 만큼 배열 길이를 할당해준다
    5 . 반복문을 sb의 길이만큼 실행한후에 문자열타입으로 되어있는 stringArr[i]의 값을 정수타입으로 변형후 결과값의 인덱스로 넣어준다

풀이방법2 ⭐️

class Solution {
  public int[] solution(long n) {
        // 문자열 + 숫자 = 문자열
      String a = "" + n;
        int[] answer = new int[a.length()];
        int cnt=0;

        while(n>0) {
            // 1) 12345 % 10 =5
            // 2) 1234 % 10 = 4
            // 3) 123 % 10 =3
            // 4) 12 % 10 =2
            // 1) 1 % 10 =1
            answer[cnt]=(int)(n%10);
            n/=10;
            System.out.println(n);
            cnt++;
        }
      return answer;
  }
}
  • 풀이

24. 내림차순으로 배치하기

-생각해야할것

class Solution {
    public long solution(long n) {
        long answer = 0;
        
        return answer;
    }
}

알고리즘 모의고사 1번문제

  • 생각해야할것
    arr1은 체크인시간배열이고 arr2체크아웃시간배열이다 그리고 두배열의 길이는 같다.
    새벽5시가 넘어가서 체크아웃을 하게된다면 자동으로 21시에 체크아웃을 한걸로 간주한다.
    새벽 5시는 24+5 로 29라고 가정한다.
    학습한 시간을 구할려면 체크인시간 - 체크아웃시간을 해주면 될꺼같다.
public class Main {
    public int solution(int[] arr1, int[] arr2) {
    int answer =0;
    for (int i=0; i<arr1.length; i++) {
    if (arr2[i] >=29) {
    answer += arr2[i] - arr1[i];
    } else {
    answer += arr2[i] -arr1[i];
    }
    }
    return answer;
    }
    public static void main(String[] args) {
        Main method = new Main();
        int[] arr1 = {9, 9, 9, 9, 7, 9, 8}; //체크인
        int[] arr2 = {23, 23, 30, 28, 30, 23, 23}; // 체크아웃
        System.out.println(method.solution(arr1, arr2));
    }
}
  • 풀이
    결과값을 담을 변수를 선언해주고 arr1의 길이만큼 반복문을 실행해서 만약 체크아웃시간이 29시(새벽5시)보다 같거나 크다면 21(시) - 체크인 시간을 해주어서 공부한시간을 answer에담아주고 그렇지않다면 (새벽5시이전에 체크아웃을 했다면) 그냥 체크아웃시간에서 체크인 시간을 뺴준값을 결과값에 담아주고 출력한다.

모의고사 2번 ⭐️

import java.time.DayOfWeek;
import java.time.LocalDate;

public class Main {
    public String solution (int month, int day) {
        // LocalDate 생성 - 날짜 지정
        LocalDate date = LocalDate.of(2022, month, day);

        // System.out.println(date);

        // targetDate = 98일 이후 날짜 
        LocalDate targetDate = date.plusDays(98);
        // targetDate에서 월 뽑아내기
        int getMonth = targetDate.getMonthValue();
        // targetDate에서 일 뽑아내기
        int getDay = targetDate.getDayOfMonth();

        return getMonth + "월 " + getDay + "일";
    }

    public static void main(String[] args) {
        Main method = new Main();
        System.out.println(method.solution(6, 22));
    }
}

0개의 댓글