반응형
728x90
반응형

git 클라이언트를 이용하여 pull 땡기다보면 별의 별 에러들을 다 본다..

pull, commit, push, merge 가 잘 이루어질 경우에는 그 쾌감은 이루 말할 수 없다.
하지만 이와 반대로, conflict를 제외한 "요상한" 에러들이 날 경우에는 그 빡침 또한 이루 말할 수 없다...

이번 포스팅에서는 그 "요상한" 에러들 중 하나를 다룰 것이다..

[에러]

git error;;

There are no candidates for merging among the refs that you just fetched.
Generally this means that you provided a wildcard refspec which had no
matches on the remote end.

git pull 시, 위와 같은 에러가 난다. 그래서 구글링 해봤을 때, 가장 유력했던 글은 아래 링크와 같다.

https://stackoverflow.com/questions/13799108/git-wildcard-refspec-with-no-match-on-remote-when-pulling

 

Git: "wildcard refspec" with no match on remote, when pulling

I have setup a new Git repository at cloufforge and have some unusual problems. When I do a git pull origin master From https://dndigital.git.cloudforge.com/project * branch master ...

stackoverflow.com

위 링크의 내용 중 답변에 해당하는 부분들을 간단히 정리해보면, 
    1. Having different versions of Git clients could become problematic it seems
        -> push 한 곳과 pull 한 곳의 git client 버전이 다른 경우
    2. destination folder being out of space.
        -> git pull 하는 곳의 폴더의 용량이 가득 차서 부족한 경우
    3. Happened to me when I tried to pull from mounted (read sshfs) directory
        -> 마운트된 외부 디렉토리에서 git pull 을 때리는 경우
    4. .git/config 설정 오류

실제로 가능성이 있던 오류들을 정리해보았다.

내 경우에는 3번과 같다.

사진

위와 같은 사진과 같은 환경에서 작업을 한다.

  • 윈도우 os에서 vm 환경으로 우분투 os를 올리고
  • vm 우분투 os 내에서 Apache2 환경을 구성하고
  • Apache2에서 서비스 할 웹 코드를 윈도우 os의 폴더로 마운트하여 사용(Shared Folders)

이런 상태에서 git pull 명령을 ssh 접속하여 우분투 os에서 git 작업을 하니까 발생하는 에러였다.

[해결 방법]

위와 같이 윈도우에서 직접적으로 git 작업을 진행하니까 감쪽 같이 에러가 사라졌다!

728x90
반응형
728x90
반응형

Apache2 VHost 설정하기

  • Apache Vhost 설정

Vhost란? Apache2의 Virtual host 기능을 통해서 하나의 아파치 서버에서 독립된 서버 공간을 나누는 작업을 의미한다.

설정 파일 조작

vhost에 필요로 하는, 수정해야하는 설정들은 위 그림에서 처럼 3가지이다.

ports.conf : 각 vhost 마다 사용할 포트 등록.
sites-available, -enabled : vhost에 필요한 설정 파일 등록.

먼저, /etc/apache2 경로의 sites-available/ 디렉토리 내에 필요한 파일을 구비할 것인데, sites-available 디렉토리현재 비활성 중인 사이트들의 설정 파일을 담고 있는 디렉토리이다. 

001-autotag.api 라는 이름으로 가상 환경을 나눈다. 내용은 다음과 같다.

<VirtualHost *:7011> 과 같이 해당 가상 환경에서 사용할 포트를 기재해주고,
ServerName 에는 도메인 주소가 들어간다.
DocumentRoot 의 경우, 렌더링할 웹 문서 파일이 존재하는 Default 경로라고 생각하면 되겠다.
ErrorLog 및 CustomLog 는 해당 vhost에서 발생하는 로그들을 어디에 저장할 것인가를 지정한다.
<Directory ~ > 부분은 해당 vhost에 대한 옵션들이라고 생각하면 된다.

--------------------------------------------------------------------------------------------------------------------------------------------------
[해당 내용]
<VirtualHost *:7011>
ServerName autotag.api
ServerAdmin ysho0707@gmail.com
DocumentRoot /server_app/autotag.api
ErrorLog ${APACHE_LOG_DIR}/django.api/error.log
CustomLog ${APACHE_LOG_DIR}/django.api/access.log combined
          <Directory /server_app/autotag.api>
                    Options All
                    AllowOverride All
                    Require all granted
          </Directory>
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
--------------------------------------------------------------------------------------------------------------------------------------------------

그리고 다음으로는 sites-enabled 디렉토리를 수정할 것이다. sites-enabled 디렉토리는 현재 활성 중인 사이트의 설정 파일들을 갖는 디렉토리인데, 보통 sites-available 디렉토리에서 심볼릭 링크를 걸어서 설정 파일을 채워넣는 형태로 진행이 된다. 그 부분을 다음에서 확인할 수 있다.

sudo ln -s /etc/apache2/sites-available/001-autotag.api.conf /etc/apache2/sites-enabled/001-autotag.api.conf

위의 명령어를 통해 심볼릭 링크를 건다.

반응형
728x90

Port 수정

다음으로는 port를 재설정할 것이다.

위와 같은 경로에 ports.conf 파일이 존재하는데 이 부분에 해당 Virtual Host 공간의 접속 포트를 추가하면 된다. 위 과정 중에서 sites-available 디렉토리 내에 001-autotag.api.conf 의 가장 첫 줄에 포트 번호가 있다. 그 번호를 추가한다.

포트를 추가하면 기본 default로 정했던 7010 포트 뿐만 아니라, autotag.api 이름의 가상 호스트의 포트 또한 접속 요청으로 수용할 수 있다.

Apache2 재시작

아파치를 위와 같이 재시작하고, 접속을 시도해본다.

접속 및 테스트

위와 같이 깔끔하게 접속이 잘 된 모습을 볼 수 있다. 해당 페이지는 “hello” 를 출력하는 페이지 파일을 001-autotag.api.conf 의 DocumentRoot 경로에 기술한 경로에 사전에 집어넣어 렌더링 된 상태이다. 

해당 디렉토리에 아무 것도 넣지 않고 접속하면 아무 것도 출력되지 않으니 확인을 해야한다.
/etc/hosts를 수정한다면 다음과 같이 접속 또한 가능하다.

/etc/hosts 파일을 다음과 같이 수정하게 되면 autotag.api 라는 주소는 앞으로 192.168.0.112로 바꿔서 해석하겠다 라는 의미를 갖는다. 

여기서 중요한 것은 그 말인 즉 슨 내 컴퓨터 내에서만 적용되는 규칙이다. 외부 사람들은 백 날 autotag.api를 친다 하더라도 접속이 되지 않을 것이다.

아래와 같이 접속이 잘 되는 것을 확인할 수 있다.

 

 

 

 

 

 

728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

출처는 프로그래머스이다.

문제는 다음 링크를 타고 들어가면 확인할 수 있다. ( programmers.co.kr/learn/courses/30/lessons/42889 )

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
/*
N    stages    result
5    [2, 1, 2, 6, 2, 4, 3, 3]    [3,4,2,1,5]
4    [4,4,4,4,4]    [4,1,2,3]
*/
 
bool CmpPair(const pair<intdouble>& i, const pair<intdouble>& j)
{
    if(i.second == j.second)
        return i.first < j.first;
    return i.second > j.second;
}
 
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<int> stage_fcnt; 
    // 각 스테이지 별로 몇 명 통과했는지를 기록 | [0]은 1번 스테이지, [1]은 2번 스테이지 ...
    vector<pair<intdouble>> failpair;
    // 각 스테이지 별 실패율이 어떤 지를 확인.
    // 이렇게 묶어두면 정렬하기가 매우 편리하다.
    
    // 스테이지의 갯수만큼 벡터 요소들 추가한다.
    for(int i=0; i<N; i++)
        stage_fcnt.push_back(0);
    
    // 각 스테이지 별로 몇 명 묶여 있는지 파악.
    for(vector<int>::iterator it=stages.begin(); it!=stages.end(); it++)
        if(*it < N+1// 1부터 N 스테이지의 실패율만 알면 되기 때문에.
            stage_fcnt[*it-1]++;
    
    // 각 스테이지 별 실패율을 구한다.
    for(int i=0, now_cnt=stages.size(); i<stage_fcnt.size(); i++)
    {
        if(stage_fcnt[i] == 0// 스테이지를 아무도 묶여 있지 않다면
            failpair.push_back(make_pair(i+10)); // 그냥 0 처리하며 now_cnt는 줄이지 않는다!!
        else 
        {
            failpair.push_back(make_pair(i+1, (double)stage_fcnt[i] / (double)now_cnt));
            now_cnt-=stage_fcnt[i];        
        }
                               
    }
 
    // 정렬을 하되 CmpPair 조건에 맞도록 정렬한다.
    sort(failpair.begin(), failpair.end(), CmpPair);
    
    // 실패율을 기준으로 pair를 정렬했으니 pair 중 stage에 해당하는 값만 answer에 저장.
    for(vector<pair<intdouble>>::iterator it=failpair.begin(); it != failpair.end(); it++)
        answer.push_back(it->first);
    
    return answer;
}
cs
728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 문제의 출처는 프로그래머스이다.

문제는 다음과 같다.

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

[ C++ 풀이 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int> solution(vector<int> arr, int divisor) {
    vector<int> answer;
    
    for(auto i : arr) // 벡터의 모든 요소를 순회하면서
        if(i%divisor == 0// 나누어 떨어지면
            answer.push_back(i); // answer 벡터에 추가
    
    if(answer.empty()) // 모든 요소를 돌았음에도 answer가 비었다면
        answer.push_back(-1); // -1 값 대입
    else // answer에 값이 들어있다면 정렬!
        sort(answer.begin(), answer.end()); // 기본은 오름차순
    
    return answer;
}
cs

 

[ Python 풀이 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def solution(arr, divisor):
    
    answer = [] # 빈 리스트 생성.
    
    for i in arr: # arr 내 요소를 순회
        if i%divisor == 0# 나누어 떨어진다면
            answer.append(i) # 해당 요소를 answer 리스트에 추가
            
    if not answer: # 리스트가 비어있다면(리스트가 비면 거짓, 들어있으면 참)
        answer.append(-1# -1 추가
    else# 리스트가 비어있지 않다면
        answer.sort() # 기본 오름차순으로 정렬.
     
    return answer
 
 
# 아래와 같이 한 줄로도 처리가 가능하다.
# sort는 리스트의 내장 함수이며, 원본 리스트 내의 순서를 변경한다
# sorted는 일반 내장 함수로 원본 리스트를 변경하지 않고, 새롭게 정렬된 리스트를 반환한다.
def solution(arr, divisor):
    return sorted([i for i in arr if i%divisor == 0]) or [-1]
 
 
cs

 

sort와 sorted 정리해본 것 같은데, 그냥 나올 때 마다 정리하겠다.

C++ 에서도 Python 에서도 딱히 어려운 부분은 없기 때문에 그냥 마무리한다.

728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제의 출처!

    • 문자열 내림차순으로 배치하기

설명

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항

  • str은 길이 1 이상인 문자열입니다.

입출력 예

            s                                                                   return

"Zbcdefg" "gfedcbZ"

 

[ C++ ]

1
2
3
4
5
6
7
8
9
10
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
string solution(string s) {
    sort(s.begin(), s.end(), greater<>()); // 내림차순 : greater<> / 오름차순 : less<>
    return s;
}
cs

sort 함수의 세번째 인자로는 오름, 내림차순 혹은 정렬의 조건을 포함하는 함수를 넣을 수 있다. 

주석과 같이 greater / less 등의 임시 객체 함수로 내림차순과 오름차순을 정할 수 있다.

[ Python ]

1
2
3
4
5
def solution(s):
    return "".join(sorted(s, reverse=True))
    # sorted : s를 정렬하여 새로운 리스트를 반환. (list.sort는 내부 정렬을 함. 새로운 리스트를 반환하지 않음)
    # "".join() join 내의 리스트 요소들을 모두 합치는데, 앞의 문자나 문자열을 요소 중간마다 채움.
 
cs

sorted 함수와 리스트 내의 sort 함수의 차이점을 주석에 적었으며, join 의 사용법 또한 주석 처리 되어 있다.

728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <iostream>
using namespace std;
 
bool solution(string s)
{
    int pcnt=0, ycnt=0;
    
    for(auto ch : s) // 모든 s의 문자들을 순회하면서
        if(toupper(ch) == 'P'// 대문자화 한 문자가 P라면
            pcnt++// p 카운팅
        else if(toupper(ch) == 'Y'// 대문자화 한 문자가 Y라면
            ycnt++// y 카운팅
    
    return (pcnt == ycnt)? true : false
}
cs

[ Python ]

1
2
3
def solution(s):
    s = s.upper() # 모두 대문자로 변경하고 '갱신'
    return True if s.count('P'== s.count('Y'else False # Count를 통해 수를 세고, 삼항 연산을 통해 각 수를 비교
cs

string 에서 count 함수는 해당 문자가 string 에 몇 개 들어있는가를 반환!

728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

위는 출처!

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

 

너무 간단해서 그냥 주석도 필요없다 

[ C ]

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
char* solution(int num) {
    char* answer = (char*)malloc(sizeof(char)*6);
    strcpy(answer, (num%2==0)? "Even" : "Odd");
    return answer;
    // return (num%2==0)? "Even" : "Odd"; // 이렇게 한 줄만 써도 가능.
}
cs

[ C++ ]

1
2
3
4
5
6
7
8
9
#include <string>
#include <vector>
 
using namespace std;
 
string solution(int num) {
    string answer = [&] (int n) -> string { return (n&1)? "Odd":"Even"; }(num); // 람다 표현식을 한 번 써봄ㅋ.
    return answer;
}
cs

[ Python ]

1
2
3
def solution(num):
    answer = 'Even' if num%2 == 0 else 'Odd' # 삼항 연산자 사용
    return answer
cs

 

728x90
반응형
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 문제 출처는 위의 프로그래머스다 ㅋ

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

[ C++ ]

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
string solution(vector<int> numbers, string hand) {
    string answer = "";
    
    vector<int> left_numbers({ 147-1 }); // 왼쪽 사이드 버튼들로 여기 버튼들은 무조건 왼손으로만 누른다.
    vector<int> right_numbers({ 369-2 }); // 오른쪽 사이트 버튼들로 여기 버튼들은 무조건 오른손으로만 누른다.
    vector<int> mid_numbers({ 2580 }); // 가운데 사이드 버튼들로 누르기 위해 거리를 계산해야하는 버튼들.
    
    int last_left_finger = -1, last_right_finger = -2// 직전에 각 손이 누른 번호를 기록. -> 직전 버튼과 현재 버튼 사이에 거리를 구해야하기 때문
    bool last_left_flag = true, last_right_flag = true
    // 각손의 직전에 누른 버튼이 각 사이드를 눌렀는지 여부. -> 사이드를 눌렀을 때와 가운데 사이드를 눌렀을 때의 거리 계산이 다르기 때문에 식별해야함.
    int left_distance = 0, right_distance = 0// 왼손과의 거리, 오른손과의 거리
 
    for(auto now_number : numbers) // 누른 번호들을 하나씩 순회하면서
    {
        if(find(left_numbers.begin(), left_numbers.end(), now_number) != left_numbers.end()) // 왼쪽 사이드에 있는 번호라면
        {
            answer += "L"// 답을 작성
            last_left_finger = now_number; // 직전 누른 번호를 갱신
            last_left_flag = true// 사이드 번호를 눌렀으니 true로 갱신
        }
        else if(find(right_numbers.begin(), right_numbers.end(), now_number) != right_numbers.end())
        {
            answer += "R"// 답을 작성
            last_right_finger = now_number; // 직전 누른 번호를 갱신
            last_right_flag = true// 사이드 번호를 눌렀으니 true로 갱신
        }
        else // 만약에 현재 누른 버튼이 가운데 사이드라면 직전에 눌린 
        {
            if(last_left_flag == false// 왼손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면 
            { // 단순 인덱스 차 계산을 진행한다.
                left_distance = find(mid_numbers.begin(), mid_numbers.end(), last_left_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
                left_distance = (left_distance<0)? left_distance * -1 : left_distance;
            }
            if(last_right_flag == false// 오른손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면 
            { // 단순 인덱스 차 계산을 진행한다.
                right_distance = find(mid_numbers.begin(), mid_numbers.end(), last_right_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
                right_distance = (right_distance<0)? right_distance * -1 : right_distance;
            }
            if(last_left_flag == true// 왼손이 마지막으로 눌렀던 번호가 왼쪽 사이드의 버튼을 눌렀다면 
            {  // 현재 눌린 번호로부터 왼쪽 손의 왼쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
                int idx = find(left_numbers.begin(), left_numbers.end(), last_left_finger) - left_numbers.begin();
                for(int i=0; i<mid_numbers.size(); i++)
                    if( mid_numbers[i] == now_number )
                        left_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
            }
            if(last_right_flag == true// 오른손이 마지막으로 눌렀던 번호가 오른쪽 사이드의 버튼을 눌렀다면 
            { // 현재 눌린 번호로부터 오른쪽 손의 오른쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
                int idx = find(right_numbers.begin(), right_numbers.end(), last_right_finger) - right_numbers.begin();
                for(int i=0; i<mid_numbers.size(); i++)
                    if( mid_numbers[i] == now_number )
                        right_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
            }
 
            // 아래부터는 거리를 계산하여 가까운 쪽 손으로 처리를 하되, 거리가 같은 경우에는 main손?으로 처리한다.
            if(left_distance < right_distance)
            {
                last_left_flag = false;
                last_left_finger = now_number;
                answer += "L";
            }
            else if(left_distance > right_distance)
            {
                last_right_flag = false;
                last_right_finger = now_number;
                answer += "R";
            }
            else if(left_distance == right_distance)
            {
                if(hand == "left")
                {
                    last_left_flag = false;
                    last_left_finger = now_number;
                    answer += "L";
                }
                else if(hand == "right")
                {
                    last_right_flag = false;
                    last_right_finger = now_number;
                    answer += "R";
                }
            }
        }
    }
    return answer;
}
cs

[ Python ]

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def solution(numbers, hand):
    answer = ''
    
    left_side = [ 147-1 ]
    right_side = [ 369-2 ]
    mid_side = [ 2580 ]
    
    last_left_val = -1
    last_right_val = -2
    
    for i in numbers:
        
        if i in left_side: # i가 왼쪽 사이드인 경우 -> 왼손으로 그냥 누르면 됨.
            answer += 'L' 
            last_left_val = i
        elif i in right_side: # i가 오른쪽 사이드인 경우 -> 오른손으로 그냥 누르면 됨.
            answer += 'R'
            last_right_val = i
        else# i가 가운데 사이드인 경우 -> 경우마다 거리를 계산해야 함.
            if last_left_val in mid_side: # 왼손 마지막이 가운데 줄에 있으면 -> 단순 계산
                left_dist = mid_side.index(i) - mid_side.index(last_left_val)
                left_dist = (lambda n: n*-1 if n<0 else n)(left_dist)
            
            if last_right_val in mid_side: # 오른손 마지막이 가운데 줄에 있으면 -> 단순 계산
                right_dist = mid_side.index(i) - mid_side.index(last_right_val)
                right_dist = (lambda n: n*-1 if n<0 else n)(right_dist)
            
            if last_left_val in left_side: # 왼손 마지막이 왼쪽 줄에 있으면 -> 거리 구함
                left_dist = abs(left_side.index(last_left_val) - mid_side.index(i)) + 1
            
            if last_right_val in right_side: # 오른손 마지막이 오른쪽 줄에 있으면 -> 거리 구함
                right_dist = abs(right_side.index(last_right_val) - mid_side.index(i)) + 1
                
            # 거리 비교 후, 처리
            if left_dist < right_dist:
                answer += 'L'
                last_left_val = i
            elif left_dist > right_dist:
                answer += 'R'
                last_right_val = i
            else:
                if hand == "left":
                    answer += 'L'
                    last_left_val = i
                elif hand == "right":
                    answer += 'R'
                    last_right_val = i
    
    return answer
cs

 

같은 논리로 작성된 코드인데 파이썬이 압도적으로 짧다..

C++에서는 find 함수의 사용법이나 활용법, 차이를 통해 인덱스 차이를 구할수 있는 부분 등을 확인하면 되고, Python에서는 index 함수(없을 경우에는 에러가 나기 때문에 확실히 존재하는 값일 경우 인덱스를 구하기 위해 사용), in 절, 람다 함수, abs 함수 사용법을 보고 넘어가면 될 것이다.

728x90
반응형

+ Recent posts