티스토리 뷰
코딩테스트 연습 - 표 편집
8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"
programmers.co.kr
문제풀이
2021 카카오 채용연계형 인턴십 코딩테스트 문제로 나왔다.
코테 때도 시간초과가 나서 해결을 하지 못했는데 다시 풀어도 그렇다,,
2021 카카오 인턴십 for Tech developers 코딩 테스트 해설
2021년 카카오의 여름 인턴십의 첫 번째 관문인 코딩 테스트가 지난 2021년 5월 8일에 4시간에 걸쳐 진행되었습니다. 이번 인턴 코딩 테스트에서는 5문제가 출제되었습니다. 이전과 동일하게 쉬운
tech.kakao.com
처음에는 벡터로 풀었는데 정확성 테스트는 다 통과했지만 효율성 테스트는 빵점,,,
카카오 기술블로그의 코딩 테스트 해설을 참고해서 풀어보았다.
아래 코드는 정확성은 모두 통과하고 효율성 테스트는 9, 10번만 통과한 코드다.
내일 다시 도전!!
#include <string>
#include <vector>
#include <list>
using namespace std;
string solution(int n, int k, vector<string> cmd) {
vector<bool> deleted(n); // true : 삭제된 행
vector<int> st;
list<int> table;
for (int i = 0; i < n; i++) table.push_back(i);
auto cur = table.begin();
for (int i = 0; i < k; i++) cur++;
for (int i = 0; i < cmd.size(); i++) {
if (cmd[i][0] == 'U') {
for (int j = 0; j < stoi(cmd[i].substr(2)); j++) {
cur--;
}
}
else if (cmd[i][0] == 'D') {
for (int j = 0; j < stoi(cmd[i].substr(2)); j++) {
cur++;
}
}
else if (cmd[i][0] == 'C') {
deleted[*cur] = true;
st.push_back(*cur);
auto now = cur;
if (*cur == table.back()) cur--;
else cur++;
table.erase(now);
}
else if (cmd[i][0] == 'Z') {
deleted[st.back()] = false;
table.push_back(st.back());
table.sort();
st.pop_back();
}
}
string answer = "";
for (int i = 0; i < deleted.size(); i++) {
if (deleted[i]) answer += 'X';
else answer += 'O';
}
return answer;
}
Z 명령어를 수행할 때 들어갈 자리를 찾는 것에 시간이 많이 걸리는 것 같다.
코드를 고쳤는데도 계속 시간초과 떠서 아래 블로그를 참고해서 풀어봤다.
[프로그래머스 Lv3] 표 편집(with Swift)
#프로그래머스, #카카오 채용연계형 인턴쉽, #스위프트, #표 편집, #Swift, #swift
velog.io
prev, next 배열을 만들어서 링크드 리스트처럼 이전 행과 다음 행 정보를 관리해주었다.
행을 삭제하면 이전 행과 다음 행을 연결해주면 되고 행을 복구하면 해당 행을 다시 연결해주면 된다.
모든 명령어를 수행한 뒤에 스택에 남아있는 행들은 X 처리해주면 끝!
C++ 코드
#include <string> | |
#include <vector> | |
#include <stack> | |
using namespace std; | |
string solution(int n, int k, vector<string> cmd) { | |
stack<int> st; // 삭제된 행 | |
vector<int> prev; | |
vector<int> next; | |
for (int i = 0; i < n + 2; i++) { | |
prev.push_back(i - 1); | |
next.push_back(i + 1); | |
} | |
k++; | |
for (int i = 0; i < cmd.size(); i++) { | |
if (cmd[i][0] == 'U') { | |
for (int j = 0; j < stoi(cmd[i].substr(2)); j++) { | |
k = prev[k]; | |
} | |
} | |
else if (cmd[i][0] == 'D') { | |
for (int j = 0; j < stoi(cmd[i].substr(2)); j++) { | |
k = next[k]; | |
} | |
} | |
else if (cmd[i][0] == 'C') { | |
st.push(k); | |
next[prev[k]] = next[k]; | |
prev[next[k]] = prev[k]; | |
if (next[k] == n + 1) k = prev[k]; | |
else k = next[k]; | |
} | |
else if (cmd[i][0] == 'Z') { | |
int r = st.top(); | |
next[prev[r]] = r; | |
prev[next[r]] = r; | |
st.pop(); | |
} | |
} | |
string answer; | |
answer.append(n, 'O'); | |
while (!st.empty()) { | |
answer[st.top() - 1] = 'X'; | |
st.pop(); | |
} | |
return answer; | |
} |
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 문자열 압축 C++/Kotlin (0) | 2021.08.03 |
---|---|
[프로그래머스] 네트워크 C++/Kotlin (1) | 2021.08.02 |
[프로그래머스] 여행경로 C++ (0) | 2021.07.28 |
- Total
- Today
- Yesterday
- 배열
- programmers
- 트리
- 정렬
- 그래프
- 구현
- 투 포인터
- 백준
- 두 포인터
- 위상 정렬
- 큐
- C++
- 프로그래머스
- 재귀
- 스택
- SW Expert Academy
- 이분 탐색
- BOJ
- algorithm
- 알고리즘
- Two Pointer
- 분할 정복
- 자바
- BFS
- Kotlin
- 브루트포스
- SWEA
- Java
- 문자열
- dfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |