• 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

[제한조건]

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

[입출력 예]

 

 

 


추측) 

달마다 28일인지 29일(윤년)인지 30일인지 31일인지를 구분할 수 있는게 먼저 필요하다. 그게 구분이 가능하다면 a월 전까지 모든 일수를 더하고 b까지를 더한다. 이를 7로 나누면 나머지가 나올텐데 이게 금요일로 부터 몇번째 날인지 일 것이다. 그것을 요일에 대입해 출력하면 될 듯 하다.

 

 

소스코드) 

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};	// 달마다 일수
        String[] dayWeek = {"FRI","THU","SUN","MON","TUE","WED","THU"};	// 요일
        int plusDays = 0;
        for (int i=0; i<a-1; i++){
            plusDays += days[i];		// a월 전까지 일수 더하기
        }
        plusDays = plusDays + b -1 ; 		// a월의 일수인 b까지 더하고 -1를 한다* 아래서 설명
        int day = (plusDays % 7);		// 7로 나눈 나머지가 금요일 당일로부터 몇번 날인지 출력
        answer = dayWeek[day];			// 거기에 맞는 요일을 출력
        return answer;
    }
}

 

리뷰) 

주어진 순서 그대로 하겠다고 했다가 너무 어렵게 생각한거 같다. 주어진 순서대로 요일에 숫자를 부여해 금요일에 시작하니 +5를 주고 거기에 7로 나눈 나머지를 더해 다시 7를 빼는 등의 시도도 해봤었다. 하지만 이쪽으로 풀이하면서 기준점을 잘 변경하는 것도 문제를 쉽게 만드는데 큰 도움을 준다는 걸 깨달았다. 결과값으로 나오는 값이 계속 그 다음 요일이여서 많이 고민했다. 왜 하루의 차이가 생길까. 그건 1월 1일이 만 하루가 지난 날이 아니기 때문이다.

이 식에서 -1을 해주지 않고  a=1, b=1 을 넣어 1월 1일을 넣었다면 결과값으로 dayWeek[1]이 나와 토요일이 나온다. 만하루가 지난 다음날이 나오기 때문 그래서 -1 값을 적용해 준다.

 

달리기반 첫문제였는데도 쉽지 않다. 정말 열심히 해야할 거 같다. ㅠ

 

 

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

[제한사항]

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

[입출력 예] 

 

 


추측) 

공백으로 단어별로 나누어서 단어 개수를 가져와 전체 그 수만큼 for문을 돌리고 또 그 단어의 길이 만큼 for문을 돌려 인덱스 0부터 시작해 짝수는 대문자, 홀수는 소문자로 출력하면 될거 같다. 공백은 대문자화나 소문자화에 영향을 안받을거 같다. 

 

소스코드)  - 성공 코드

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

for (int i=0; i<s_arr.length; i++){
    if(s_arr[i].equals(" ")){
        cnt = 0;
        answer += " ";
    } else {
        answer += (cnt%2==0) ? s_arr[i].toUpperCase() : s_arr[i].toLowerCase();
        cnt++;
    }
}
return answer;

소스코드) - 시도했지만 실패한 코드 

더보기
String answer = "";
String[] s_arr = s.split(" ");

for(int i=0; i<s_arr.length; i++){
    System.out.println(s_arr[i]);
}

for (int i=0; i<s_arr.length; i++){
    for (int k=0; k<s_arr[i].length(); k++){
        String a = s_arr[i].substring(k,k+1);
        answer += (k % 2 == 0) ? a.toUpperCase() : a.toLowerCase();
    }
    answer += " ";
}

return answer.trim();

 

 

 

리뷰) 

생각한대로 코드를 짰는데 예시에서는 성공했지만 계속 예외가 떴다. 예외를 알지 못하는 상태로 계속 반복되어서 다른분이 푸신걸 참조해 흐름을 대략 파악하고 다시 코드를 짜봤다. (며칠후에 잊혀질 쯤 꼭 다시 해볼 것)

빈칸으로 단어를 나누지 않고 모든 스트링을 다 나누어 배열로 나누고 for문을 돌린다. 처음부터 돌릴때 처음이 공백이 아니면 단어의 시작이므로 count를 0으로 하여 0부터 시작해 짝수는 대문자, 홀수는 소문자로 출력할 수 있게 한다. 출력을 하면 count를 하나더 올려 다음으로 넘어간다. 이런식으로 단어하나를 다 출력하고 공백을 만나면 count를 초기화시킨다. 그리고 다시만난 문자를 시작으로 다시 이렇게 반복하면 성공한다.

 

아직도 첫번째 시도 했던 방법이 왜 안됬는지 모르겠다. 이건 기술매니저님께 한번 물어봐야겠다. 

: 텍스트로 입력값으로 들어오는 텍스트에도 뒤에 공백이 그대로 들어오는 경우도 있을건데, 그걸 다 잘라버리는 경우가 생겨서 그런거 같다.

+ Recent posts