Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C++
- graph #최단경로
- c++ #boj #
- BOJ
- 3343
- 22869
- backtracking #codetree #디버깅 #삼성코테
- LIS #가장긴증가하는부분수열 #
- graph
- 레드아보
- 이분탐색 #dp #11053
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- hcpc
- 16202
- 백준
- 백준 #다익스트라 #dijkstra #9370 #c++
- 투포인터 #백준 #boj #20922 #22862
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
- N번째큰수
- 쌤쌤쌤
- 1174
- 줄어드는수
- 호반우 상인
- 코딩
- 20117
- boj #백준
- 사이클 없는 그래프
- 30870
Archives
- Today
- Total
hyunjin
[level 1]키패드 누르기 , pair,abs 사용 본문
728x90
첫 번째 방법
#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int l=9,r=11;
for(int i = 0 ; i < numbers.size();i++){
if(numbers[i] == 0) numbers[i] = 10;
else numbers[i]--;
if(numbers[i]%3==0){
answer += "L";
l = numbers[i];
}
else if(numbers[i]%3 == 2){
answer += "R";
r = numbers[i];
}
else{
int h = numbers[i]/3;
int tmp1 = abs(h - l/3) + (1 - (l%3));
int tmp2 = abs(h - r/3) + ((r%3)-1);
if(tmp1 < tmp2){
answer += "L";
l = numbers[i];
}
else if (tmp1 > tmp2){
answer += "R";
r = numbers[i];
}
else{
if(hand.compare("left")==0){
answer += "L";
l = numbers[i];
}
else{
answer += "R";
r = numbers[i];
}
}
}
}
return answer;
}
두 번째 방법
어차피 같은 흐름이지만 pair를 사용해보았다.
#include <string>
#include <vector>
#include <utility>
#include <cstdlib>
using namespace std;
int len_pair(pair<int,int> a, pair<int,int> b){
return abs(a.first-b.first) + abs(a.second-b.second);
}
string solution(vector<int> numbers, string hand) {
string answer = "";
pair<int,int> l = make_pair(3,0),r= make_pair(3,2),t;
for(int i = 0 ; i < numbers.size();i++){
if(numbers[i] == 0 ) t= make_pair(3,1);
else t = make_pair( (numbers[i]-1)/3 ,(numbers[i]-1)%3);
if(t.second == 0){
answer += "L";
l = t;
}
else if(t.second == 2){
answer += "R";
r = t;
}
else{
int len1 = len_pair(l,t);
int len2 = len_pair(r,t);
if(len1<len2){
answer += "L";
l = t;
}
else if(len1>len2){
answer += "R";
r = t;
}
else{
if(hand.compare("left")==0){
answer += "L";
l = t;
}
else{
answer += "R";
r = t;
}
}
}
}
return answer;
}
- 문제 풀 때 기존의 숫자 패드는 열의 배열이 3으로 나눴을 때 1,2,0 순 => 계산 시 복잡해짐을 느껴서 바꿈
- 전체적으로 1을 빼주고 (0,0)의 페어 형태로 표현해 계산했다 => 거리 계산 시 편함
- 주의할 점은 거리 계산이 (x,y) 각 자리 차의 제곱의 합이 아닌 각 자리 차의 절댓값의 합으로 풀어야한다.
- 문제에서 칸 이동을 1씩으로 잡았기 때문
- abs 함수
- 헤더 파일 : int 형 <cstdlib>, 이외 <cmath>
728x90
'알고리즘 연습 > 프로그래머스' 카테고리의 다른 글
[level 1] 문자열 다루기 기본 , isdigit (0) | 2020.07.10 |
---|---|
[level 2]탑 , 스택/큐 문제 (0) | 2020.07.07 |
[level 1] 수박수박수? 문제, 비트 연산자 사용 (0) | 2020.07.06 |
[level 1] 예산 문제, sort 사용 (0) | 2020.07.06 |
[level1] 주식가격 , reverse 함수 사용 , stack 사용 (0) | 2020.06.29 |