일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩시험
- C++
- CMAKE
- MediaCodec
- 프로그래머스
- JavaScript
- 데일리코테
- pyenv
- 완주하지못한선수
- Cpp
- Android
- 기술인터뷰
- 파이썬설치
- 데일로코테
- 코테
- 일일코테
- Python
- 안드로이드
- 개발영어
- AAudio
- 코딩테스트
- 알고리즘
- sdkmanager
- NDK
- MediaExtractor
- 커맨드라인툴
- 알고리듬
- 이직
- 3진수
- 크레인인형뽑기
- Today
- Total
Nomad Engineer
[일일코테 Day5] 모의고사 - 프로그래머스(레벨1) 본문
문제: 모의고사(레벨1)
programmers.co.kr/learn/courses/30/lessons/42840
코딩테스트 연습 - 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는
programmers.co.kr
문제는 간단했다. 3개의 패턴이 주어지고 그 패턴을 실제 답안지와 비교해서 점수를 매기는것. 언어의 기본적인 기능들을 사용할줄 아는지 묻는 문제 같았다. 반복문, 예외처리, 정렬, 필터링.
구현:
알고리즘 고민 : 5분
구현 시간: 15분
에러 해결: 10분
해결해야할 문제는
- 패턴순환하기
- 점수 매기기
- 점수로 정렬하기
- 공동순위 처리하기
내가 신경쓴 포인트 들은
- 순환처리: 간단한 Pattern 클래스를 만들어서 실제 알고리즘은 단순하게 보이도록 했다.
- 정렬: 정렬은 간단하게 sort함수를 사용
- 공동순위 처리는 단순하게 filter함수를 사용하였다.
실수했던 부분
코드가 완벽하다가 생각하고 채점을 돌렸는데, 절반 이상의 테스트 케이스가 실패하였다.
어떤부분에서 틀렸을지 감이오지 않아서. 몇 가지 문제가 있을 만한 부분을 로그를 찍어 보았다.
- 채점 결과
- 정렬
하지만 이미 존재하던 테스트 케이스로는 확인이 되지 않았고, 또 복잡한 어떤 테스트 케이스를 추가해야 할지 막막했는데. 일단 단순하게 실수 했을것 같은 지점(자신이 없는 지점)을 생각해 봤다.
- 패턴의 순회 부분처리를 잘 못햇을 수 있을것 같은 느낌
- 순위의 정렬이 잘못 됐을것 같은 느낌.
패턴 순회 부분은 테스트 케이스의 배열을 두배로 늘려 순회를 더 많이 하도록 했고. 정렬을 잘못했을것 같은 부분은 임의로 1위를 다르게 조작해 봤다.
테스트케이스를 추가하고 돌려보니. 순위 정렬쪽에서 문제가 있었고 전혀 정렬히 제대로 되고 있지 않았다. sort함수 사용법을 대충 만들었던걸 떠올리고 MDN에서 sort 함수 사용법을 검색해 봤다.
compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. a와 b가 비교되는 두 요소라면,
- compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.
- compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다. 참고 : ECMAscript 표준은 이러한 동작을 보장하지 않으므로 모든 브라우저(예 : Mozilla 버전은 적어도 2003 년 이후 버전 임)가 이를 존중하지는 않습니다.
- compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다.
- compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.
역시 sort 함수를 잘못 사용하고있었다.
// 내가 했던 방법
sort((a, b) => ( b.score < a.score))
// 올바른 방법
sort((a, b) => ( b.score - a.score))
다시 최종 채점을 돌려보니 모두 성공.
JavaScript로 풀어보기
class Pattern {
constructor(p) {
this.pattern = p;
this.period = p.length;
this.index = 0;
}
read() {
let currentValue = this.pattern[this.index++];
if (this.index > this.period-1) {
this.index = 0;
}
return currentValue;
}
}
function solution(answers) {
const pattern1 = new Pattern([1, 2, 3, 4, 5]);
const pattern2 = new Pattern([2,1,2, 3,2,4,2,5]);
const pattern3 = new Pattern([3,3,1,1,2,2,4,4,5,5]);
const patterns = [pattern1, pattern2, pattern3];
const scores = [{i: 1, score: 0},{i: 2, score: 0}, {i: 3, score: 0}];
// 채점하기
for (let a of answers) {
patterns.forEach((pattern, i) => {
let expect = pattern.read();
if (expect === a ) {
scores[i].score += 1;
}
})
}
// 정렬하고 1위 값을 순서대로 얻기
return = scores
.sort((a, b) => ( b.score - a.score))
.filter((score, i, scores) => score.score == scores[0].score)
.map(rank => rank.i);
return ranks;
}
C++ 로 풀어보기
c++로 풀어봤는데 현재 1년정도 다시 c++을 사용하고 있음에도 불구하고 익숙하지 않은 부분들이 있어서. 문제를 다시 푸는데 무려 1시간이상 걸렸다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Pattern {
public:
Pattern(initializer_list<int> l) : pattern(l), score(0), index(0) {}
void increaseScore() {
score++;
}
int readNext() {
int value = pattern[index++];
if (index >= pattern.size()) {
index = 0;
}
return value;
}
private:
vector<int> pattern;
size_t index;
int score;
};
class Score {
public:
Score(int i, int s) : index(i), score(s) {}
public:
int index;
int score;
};
vector<int> solution(vector<int> answers) {
Pattern p1{1, 2, 3, 4, 5};
Pattern p2{2, 1, 2, 3, 2, 4, 2, 5};
Pattern p3{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
vector<Pattern*> patterns{&p1, &p2, &p3};
Score scores[3] = {Score(1, 0), Score(2, 0), Score(3, 0)};
// 채점하기
for(int answer : answers) {
for(size_t i=0; i < patterns.size(); ++i) {
if (patterns[i]->readNext() == answer) scores[i].score++;
}
}
// 점수 오름차순으로 정렬
sort(&scores[0], &scores[3], [](auto a, auto b) { return a.score > b.score; });
// 최고 점수만 정담으로 추가
vector<int> answer;
for (const Score& s : scores) {
if (s.score != scores[0].score) break;
answer.push_back(s.index);
}
return answer;
}
잘 몰랐던 부분들은
- 배열을 생성자로 어떻게 넘기지?
- 클래스의 배열은 어떻게 초기화 하지?
- c++에서 정렬은 어떻게 하지.. std::sort 였던것 같은 느낌이
- 맴버 변수 초기화를 안해줘서 클래스를 사용할때 segmentation error
References
'개발 > 코딩테스트' 카테고리의 다른 글
[일일코테 Day6] 체육복 - 프로그래머스(레벨1) (0) | 2021.03.01 |
---|---|
[일일코테 Day7] K번째 수 (0) | 2021.03.01 |
[일일코테 Day4] 신규 아이디 추천 - 프로그래머스(레벨1) (0) | 2021.02.28 |
일일코테 Day3 - 완주하지 못한 선수 - 프로그래머스 [level1] (0) | 2021.02.27 |
일일코테 Day2, 크레인 인형뽑기 게임 - 프로그래머스(레벨1) (0) | 2021.02.27 |