티스토리 뷰
문제
https://programmers.co.kr/learn/courses/30/lessons/81303
코딩테스트 연습 - 표 편집
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
풀이
당시에 풀 때도 링크드리스트로 풀다가 삽질하고 set으로 방향을 틀었던 기억이 나는데 문제를 꼼꼼히 안읽으면 우왕좌왕 해매기 쉬운문제였던 것 같습니다. 다시 링크드리스트로 구현해봐야지,,
1. 주의 깊게 봐야하는 부분은 아래와 같습니다.
※ "이름"열에는 서로 다른 이름들이 중복없이 채워져 있다고 가정하고 문제를 해결해 주세요.
→ 결국 행 번호가 겹치지않는다는 의미입니다.
※ cmd에 등장하는 모든 X들의 값을 합친 결과가 1,000,000 이하인 경우만 입력으로 주어집니다.
→ 현재 선택된 행에서 이동할 때 움직이는 부분을 어떻게 구현할지가 문제였는데 해당 조건을 보면 커서를 직접 움직여도 됩니다,,
※ 행을 삭제할 때, 커서가 맨 마지막 행이라면 바로 전 행으로 커서가 움직입니다.
→ 삭제시, 마지막 행인지 체크하고 직전 행으로 움직이도록 구현해야합니다.
※ X는 1 이상 300,000 이하인 자연수이며 0으로 시작하지 않습니다.
→ 이 부분도 문제를 안읽고, 한참 해맸습니다,,
2. 중복없는 숫자들을 관리하며 위치를 움직인다 → set을 이용하면 숫자 관리, iterator를 통한 커서관리를 할 수 있습니다.
삭제된 숫자들을 복구한다 → 스택이나 벡터를 이용하여 마지막으로 들어온 행을 관리할 수 있고, 새로운 값이 추가되는 연산이 없기에 돌아 갈 위치는 유일합니다.
3. 따라서 앞서 언급한 내용을 종합하면 행 관리는 set을 이용하고, 삭제된 행관리는 벡터나 스택을 이용해 해결할 수 있습니다.
코드
1. Set을 이용한 풀이
#include <bits/stdc++.h>
using namespace std;
string solution(int n, int k, vector<string> cmd) {
string answer ="";
answer.resize(n, 'X');
set<int> s;
vector<int> del;
for (int i = 0 ; i < n ; i++) s.insert(i);
for (string c : cmd){
if (c[0] == 'C') {
int kk = k;
set<int>::iterator cur = s.find(k);
set<int>::iterator pre = prev(cur);
set<int>::iterator nxt = next(cur);
if (nxt == s.end()) k = *pre;
else k = *nxt;
del.push_back(kk);
s.erase(kk);
}
else if (c[0] == 'Z') {
s.insert(del.back());
del.pop_back();
}
else if (c[0] == 'D' || c[0] == 'U'){
int x = stoi(c.substr(2));
set<int>::iterator cur = s.find(k);
if (c[0] == 'D') while (x--) cur = next(cur);
else while (x--) cur = prev(cur);
k = *cur;
}
}
for (int i : s) answer[i] = 'O';
return answer;
}
2. 링크드리스트를 이용한 풀이(추후에,,)
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스 위클리 챌린지 3주차] 퍼즐 조각 채우기 (0) | 2021.08.17 |
---|---|
[프로그래머스 2021 카카오 채용연계형 인턴십] 거리두기 확인하기 (0) | 2021.07.10 |
[프로그래머스 2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어 (0) | 2021.07.10 |
[프로그래머스 월간 코드 챌린지 시즌2] 모두 0으로 만들기 (0) | 2021.04.16 |
[프로그래머스 월간 코드 챌린지 시즌2] 괄호 회전하기 (0) | 2021.04.16 |
- Total
- Today
- Yesterday
- 트리
- 프로그래머스 위클리 9주차
- 동적계획법
- 프로그래머스 월간코드챌린지
- 이분탐색
- 백준
- 투포인터
- 2022 KAKAO BLIND RECRUITMENT
- 프로그래머스
- 구현
- 카카오 표 편집
- 2020 KAKAO BLIND RECRUITMENT
- 게임이론
- BFS
- 2021 KAKAO BLIND
- 파싱
- 카카오 2020 인턴십
- 카카오 2차코딩테스트
- 카카오 2021
- DP
- 2021 카카오 블라인드
- 2022 카카오블라인드
- Kakaoblind
- 표 편집
- 2022 카카오 블라인드 코딩테스트
- 카카오 인턴십
- 위클리 챌린지
- 누적합
- 시뮬레이션
- 유니온파인드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |