250x250
반응형
05-10 06:13
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[Swift] 프로그래머스 연습 문제(Level 1) : 2016년 본문

CS(컴퓨터 과학)/Coding Test

[Swift] 프로그래머스 연습 문제(Level 1) : 2016년

billnjoyce 2020. 11. 8. 12:33
728x90
반응형
실제 코딩테스트의 문제를 통하여 알고리즘 분석과 코딩 능력을 향상시킵니다.

 

 

#. 구독 대상

  • 기본 알고리즘을 코딩 테스트 문제를 통하여 학습하고 싶으신 분
  • 취업 및 이직을 준비하고 계신 개발자
  • Swift를 통하여 코딩 테스트 문제를 살펴보고 이해를 하고 싶으신 분
  • 코딩 테스트에 대한 거부감을 없애기 위하여 기초부터 하나씩 공부해보고 싶으신 분
  • 기타 알고리즘과 문제 해결 능력에 대해서 관심이 있는 모든 개발자분
참고 사항

본 코딩 테스트 문제에 대한 설명 및 해결 방안은 최적의 답이 아닐 수 있습니다.

본 강의에서 지향하는 목표는 바로 특정 문제에 대한 최적의 해결 방법을 찾기보다는 특정한 문제에 대해서 충분히 이해할 수 있고 다양한 방법을 통하여 해결하는 방법을 찾고 향상시키는데 그 목적이 있습니다.

좀 더 좋은 알고리즘 및 코드가 있으시다면 언제든지 본 게시물의 댓글을 통해서 제시해주시면 감사하겠습니다.

 

 

 


 

 

 

코딩 테스트 문제

 

programmers.co.kr/learn/courses/30/lessons/12901

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

 

 


 

 

 

문제 설명

 

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일같은 날짜는 주어지지 않습니다)

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

입출력 예

a b result
5 24 TUE

 

 

 

 


 

 

문제 분석

 

문제는 2016년에 대해서 한정적으로 월과 일을 입력하면 요일을 영문자로 반환하는 문제입니다.

 

문제에서의 가정은 2016년은 윤년이므로 2월의 경우 28일이 아닌 29일입니다.

또한 요일의 순서는 SUN,MON,TUE,WED,THU,FRI,SAT 등으로 구성됩니다.

그리고 가장 중요한 시작점(1월 1일)은 금요일로 시작함을 제시하고 있습니다.

 

 

 

 


 

 

 

알고리즘

 

위의 내용을 기반으로 하여 본 문제를 해결하기 위한 알고리즘을 살펴보면 아래와 같습니다.

 

  • 요일과 월을 가지고 있는 배열을 구성한다.
  • 최종 요일의 인덱스를 가지고 있는 Int형 숫자를 하나 설정한다.(요일 카운트 변수)
  • 시작일(1월 1일)이 금요일부터이므로 월 배열의 구성에 따라서 인덱스 값인 5를 요일 카운트 변수에 합산한다.
  • 입력 월(a)의 전달까지의 모든 한달의 일수를 모두 반복문을 통하여 요일 카운트 변수에 더한다.
  • 입력 일(b)의 숫자를 최종 -1을 한채(처음 선언한 요일 배열의 시작이 일요일부터 구성되었으므로) 요일 카운트 변수에 더한다.
  • 일주일은 7일 이므로 요일 카운트 변수를 7로 나눈 나머지(mod)의 값을 반환한다.

 

 

 

 


 

 

 

코드 설명

 

그렇다면 위의 알고리즘에 대해서 하나씩 살펴보면서 코드로 작성을 해보도록 하겠습니다.

 

 

  • 요일과 월을 가지고 있는 배열을 구성한다.
let days = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
let months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

 

 

  • 최종 요일의 인덱스를 가지고 있는 Int형 숫자를 하나 설정한다.(요일 카운트 변수)
  • 시작일(1월 1일)이 금요일부터이므로 월 배열의 구성에 따라서 인덱스 값인 5를 요일 카운트 변수에 합산한다.
// 1월 1일 시작이 금요일이므로 5를 증가한채로 시작
var dayOfWeek = 5

 

 

  • 입력 월(a)의 전달까지의 모든 한달의 일수를 모두 반복문을 통하여 요일 카운트 변수에 더한다.

 

 

 

// 입력월의 전달까지의 모든 한달의 일수를 모두 더한다.
for i in 0..<a-1 {
	dayOfWeek += months[i]
}

 

 

  • 입력 일(b)의 숫자를 최종 -1을 한채(처음 선언한 요일 배열의 시작이 일요일부터 구성되었으므로) 요일 카운트 변수에 더한다.
// 이번 달의 일 수를 최종적으로 합산
// 인덱스는 0부터 시작함으로 -1을 빼서 합산
dayOfWeek += b-1

 

 

  • 일주일은 7일 이므로 요일 카운트 변수를 7로 나눈 나머지(mod)의 값을 반환한다.

 

 

 

// 일주일은 7일 이므로 7로 나눈 나머지(mod)의 값을 최종 반환한다.
return days[dayOfWeek%7]

 

 

 

위의 코드들을 모두 조합하여 최종 코드를 완성하면 아래와 같습니다.

 

 

최종 코드

func solution(_ a:Int, _ b:Int) -> String {
    let days = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
    let months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    // 1월 1일 시작이 금요일이므로 5를 증가한채로 시작
    var dayOfWeek = 5
    
    // 입력월의 전달까지의 모든 한달의 일수를 모두 더한다.
    for i in 0..<a-1 {
        dayOfWeek += months[i]
    }
    
    // 이번 달의 일 수를 최종적으로 합산
    // 인덱스는 0부터 시작함으로 -1을 빼서 합산
    dayOfWeek += b-1
    
    // 일주일은 7일 이므로 7로 나눈 나머지(mod)의 값을 최종 반환한다.
    return days[dayOfWeek%7]
}

 

 

 

 


 

 

 

이상으로 오늘 제시한 문제에 대해서 분석 및 코드를 작성해 보았습니다.

 

 

 

감사합니다.

 

 

 

 


[참고 자료(References)]

 

[1] 프로그래머스 - 2016년 : programmers.co.kr/learn/courses/30/lessons/12901

728x90
반응형
Comments