일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- react native typescript
- node
- react-native
- 스탠실 버퍼 튜토리얼
- react
- react native
- react native accessible
- 싸이월드
- react native mac
- 리액트 네이티브 설치 오류
- react native typescript navigation
- cyworld
- 스탠실 버퍼 사용
- javascript
- html
- Expo
- react native typescript navigate
- c++ 정보은닉
- GitHub
- 리액트 네이티브 맥
- react native 타입스크립트
- react native ios 기기 연결
- node.js
- C++
- c++ using
- stencil buffer
- 스탠실 버퍼 시작
- CSS
- unity stencil buffer
- 벡터와 리스트의 차이
Archives
- Today
- Total
혀니의 이거저거 뿌시기
[C++]프로그래머스 키패드 누르기 본문
728x90
코딩테스트 연습 - 키패드 누르기 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<string> ans;
vector<pair<int, int>> v[10];
pair<int, int> l = {0, 3};
pair<int, int> r = {2, 3};
v[0].push_back({1,3});
for (int i = 1; i <= 9; i++)
v[i].push_back({(i + 2) % 3, (i - 1) / 3}); //배열 위치 초기화
for(int i = 0; i < numbers.size(); i++)
{
if(numbers[i] % 3 == 1)
answer.push_back('L');
else if(numbers[i] % 3 == 0 && numbers[i] != 0)
answer.push_back('R');
else
{
if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)>abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
answer.push_back('R');
else if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)<abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
answer.push_back('L');
else if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)==abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
{
if (hand == "right")
answer.push_back('R');
else if(hand == "left")
answer.push_back('L');
}
}
if(answer.back() == 'L')
l = v[numbers[i]][0];
else if(answer.back() == 'R')
r = v[numbers[i]][0];
}
return answer;
}
문제 풀이 방식
1.키패드의 위치를 좌표로 초기화하여 vector<pair<int, int>>에 할당해줌
1 {0,0} |
2 {1,0} |
3 {2,0} |
4 {0,1} |
5 {1,1} |
6 {2,1} |
7 {0,2} |
8 {1,2} |
9 {2,2} |
* {0,3} |
0 {1,3} |
# {2,3} |
이런 식으로 임의의 값을 설정하고 초기화해준다.
왼손, 오른손의 현재 좌표 위치는 항상 다시 설정해줘야 하는 값이므로 따로 l,r이라는 이름의 pair<int,int>형으로 선언해주고 각각 *, #의 위치로 초기화해준다.
2.numbers배열을 for문으로 돌며, 1,4,7에 속하면 L을, 3,6,9에 속하면 R을 answer에 push_back해준다.
3.2,5,8,0에 해당하는 경우 number의 위치가 L,R중 어떤 것이 가까운지 절댓값을 통해 따져서 (상하좌우로만 이동할 수 있기 때문) answer에 push_back해준다.
4.2,5,8,0과 l,r의 거리가 같을 경우 hand가 right인지 left인지 따져준다.
5.매 for문마다 answer삽입이 끝나면 l,r의 좌표 상태도 바꿔준다.
*알아두면 좋은 상식
1.string도 vector처럼 push_back가능. 단, 넣을 수 있는 요소는 char형
2.answer.back() =>string의 가장 끝문자 알 수 있음.
728x90
'알고리즘 공부(C++)' 카테고리의 다른 글
[C++]프로그래머스 게임 맵 최단거리 (BFS) (0) | 2023.06.27 |
---|---|
[C++]프로그래머스 피로도 (0) | 2023.06.23 |
[C++]프로그래머스 배달 (다익스트라 알고리즘 이해) (0) | 2023.06.20 |
BFS 이해 (0) | 2023.06.11 |
[C++]프로그래머스 네트워크 (0) | 2023.06.08 |