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

 

코딩테스트 연습 - 2016년

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

programmers.co.kr

문제

chalendar

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

 

발상

윤년과 그 해의 요일이 모두 주어진 문제이다.

달력 문제는 윤년계산을 포함하여 수십, 수백년 후까지 계산하는 문제가 나오기도 하는데 경시대회가 아니면 수학적이고 다소 지엽적인 문제는 코딩테스트에서 출제되지 않을거라 생각하고 간단히 그 해의 월별 날짜와 요일 배열을 만들어 경과된 일수를 더해서 구하기로 하였다.

 

의사코드

1. 초기값 세팅(월별 날짜, 반환할 요일 배열)
2. 주어진 날짜를 바탕으로 2016/1/1부터 경과된 일수 계산
3. 7로 나누어 요일 비교
4. 요일값 반환

 

개선

다른사람들이 제출한 답을 보니 캘린더 함수를 사용하는 것도 있었는데, 국가별로 날짜가 다르기 때문에 국가코드도 설정하고 하는 부분이 다소 지엽적이라고 생각하였다.

 

'IT > Algorithm' 카테고리의 다른 글

[Programmers] 같은 숫자는 싫어  (0) 2022.07.04
[Programmers] 가운데 글자 가져오기  (0) 2022.07.04
[Programmers] 모의고사  (0) 2022.07.02
[Programmers] 키패드 누르기  (0) 2022.07.02
[LeetCode] 773. Sliding Puzzle  (0) 2022.06.25

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

문제

exam with pencil

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

발상

문제 카테고리가 완전탐색인만큼 모든 경우의 수를 다 검색하면서 조건을 따지는 문제였다.

3명의 수포자가 같은 문제를 가지고 각각의 방식으로 문제를 푼다는 점에서 디자인패턴 전략패턴을 사용하면 확장성이 높고 깔끔한 코드가 나올 것 같았지만, 타임아웃이 걸릴 것 같아서 우선 반복문으로 풀어보고 다음에 리팩토링 해보기로 하였다.

 

의사코드

1. 초기값 세팅(각 수포자의 전략 템플릿)

2. 정답 확인(){

    1. a 정답 확인

    2. b 정답 확인

    3. c 정답 확인
}

3. 최고점 확인(스트림)
4. 최고점을 맞은 수포자 리스트 추출
5. 배열로 변환

 

개선

의사코드를 작성하고, 구현하고 제출하였더니 런타임에러가 발생하였다.

수포자들의 전략템플릿을 구현할 때 따로 메서드를 추출하여서 각각의 전략템플릿의 길이를 넘어가면 초기화하는 식으로 하였는데, 그 부분을 따로 계산하지 않고 나머지값과 전략템플릿 배열인덱스를 매칭하는 방법으로 리팩토링 하니 통과하였다.

 

단순히 전략패턴 업데이트만 함수로 재사용했는데도 런타임에러가 발생한 것을 보면, 추가적으로 리팩토링해서 전략 디자인패턴을 구현하면 더 호출이 복잡해지니 테스트케이스는 통과하지 못할 것 같다.

 

'IT > Algorithm' 카테고리의 다른 글

[Programmers] 가운데 글자 가져오기  (0) 2022.07.04
[Programmers] 2016년  (0) 2022.07.03
[Programmers] 키패드 누르기  (0) 2022.07.02
[LeetCode] 773. Sliding Puzzle  (0) 2022.06.25
Day 22: Binary Search Trees  (0) 2018.06.25

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

문제

휴대폰 숫자패드

숫자 배열이 주어집니다. 정해진 규칙에 따라 왼손 혹은 오른속으로 숫자패드를 누르게 되는데, 어떤 손으로 눌렀는지를 출력하세요.

 

발상

우선 왼쪽라인은 왼손, 오른쪽 라인은 오른손으로 정해져있으니, 먼저 고정값들을 반환하고

그 뒤에 현재 왼손,오른손 검지의 위치와 목표숫자의 거리를 계산하는 것이 포인트였다.

 

1. 숫자패드가 정해져있으니 숫자패드를 [1,2,~10,11,12] 숫자배열로 추상화하고

2. 엄지와 목표값의 거리를 3x4 배열의 특성을 이용하여 3으로 나눈 몫을 y거리, 3으로 나눈 몫의 나머지를 x거리로 잡아서

3. x와 y의 값을 더하여 각 손의 거리를 구하고 비교하기로 하였다.

 

 

의사코드

1. 초기값 세팅(숫자패드, 왼손, 오른손 위치)

2. 입력값 테스트(){

    1. 목표가 0일 경우 추상화한 11로 치환

    2. 손가락판별()

    3. 결과배열 더하기
}
3. 결과배열 반환



손가락판별(){

1.3으로 나누었을때 나머지가 1이면 L

2. 3으로 나누었을때 나머지가 0이고 목표가 0이 아니면 R

3. 왼손과 오른손의 목표와의 거리값 비교

4. 결과값 반환

}



거리값 비교(){

1. 목표와 현재위치 절대값 계산

2. 차이값을 3으로 나눈 몫 = y거리

3. 차이값을 3으로 나눈 몫의 나머지 = x거리

4. y+x 반환

}

 

개선

테스트케이스 통과 후, 다른사람들이 작성한 코드를 보니 발상은 비슷한데 세부적으로 최적화한 부분이 있었다.

예를들어 주어지는 값 "left","right"를 "L","R"로 새로 할당하여 비교한다던지

나는 각각의 거리를 매 로직마다 계산하게 하였는데, 패드가 작은 것을 이용하여 미리 구해놓은 값을 바로 쓰는 경우도 있었다.

다음부터는 사용하기 편리한 값들을 설정하는 것도 고려하자.

'IT > Algorithm' 카테고리의 다른 글

[Programmers] 2016년  (0) 2022.07.03
[Programmers] 모의고사  (0) 2022.07.02
[LeetCode] 773. Sliding Puzzle  (0) 2022.06.25
Day 22: Binary Search Trees  (0) 2018.06.25
Day 21: Generics  (0) 2018.06.25

+ Recent posts