최근,카카오에서 쓰여서 

더 유명해진 사이트 프로그래머스!

여기서 코딩테스트 연습용으로 

모아준 문제들이 있어서 

시간날 때마다 하나씩

풀어보고 있다.

 

⬇ 문제확인하러 가기

https://programmers.co.kr/learn/challenges

 

 

코딩테스트를 보다보면 의외로 

키를 통해 매핑하는 문제나 문자열을

가공하여 푸는 문제들이 

자주 나온다.

 

이러한 문제들에서는 

정말 파이썬이 딱이다.

마치 코딩테스트를 풀라고 

나온 언어 같다라는 

생각이 들정도다.


 

 


문제 

 

코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 partic

programmers.co.kr

 

 

 

functools의 reduce와 같은

고차함수를 사용하면

엄청난 축약이 가능하고 

문법을 안다면 의미가 직관적으로

이해되기 때문에 로직을 짜는데 

상당히 유용하다.

 

이번 문제도 이를 활용하면

간결하게 해결 할 수 있다.

 

 

 

 

 

 

작성 코드

 

from functools import reduce
def solution(participant, completion):
    part = reduce(lambda temp,value : temp.update({value:temp.get(value, 0)+1}) or temp, participant, {})
    for a in completion:
        part.update({a:part.get(a,1)-1})
    answer = list(filter(lambda a : part.get(a) != 0,part))[0]
    return answer

 

 

 


 

 

 

도움이 되셨다면

로그인이 필요없는 공감 버튼 꾹 눌러주세요! 

 

 

 

 

Python으로 DB에 insert 문을 execute 했는데 다음과 같은 에러 로그가 뜬다...

 

# 에러 로그
pymysql.err.DataError: (1406, "Data too long for column 'book' at row 1")

 

DB 스카마가 잘못된 줄 알고 Column 사이즈도 늘려봤지만 여전히 같은 문구의 에러를 출력한다.

 

-- Strict mode 확인하기 

-- MySQL이나 MariaDB에서 데이터 insert 할 때 문제가 되는 부분을 점검하는 걸로 보인다.
-- 아래와 같은 구문을 통해서 현재의 모드를 확인할 수 있다.

select @@global.sql_mode;
+-------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                         |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+

 

 

 

 

 

 

자세히 읽어보면 테이블로 데이터 전송을 엄격하게하고, 영으로 나누지 못하게하고.. 여러가지 방법으로 보호하나보다. 찾아보니 Data too long~ 에러를 일으키는 원인은 STRICT_TRANS_TABLES 이었다. 과감하게 이 부분을 지운다.

 

 

 set @@global.sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

 

 

이제 insert가 정상적으로 된다!

리눅스 환경이라면 /etc/my.cnf 부분에 접속해서 기본 설정을 직접 바꿔주고 설정을 적용하여 실행하게 하는 것도 방법이다.

 

 

 

 

 

 

import pymysql.cursors

conn = pymysql.connect(
        host='aaaicu.synology.me', # MariaDB 서버
        user='dev_kyome',  # MariaDB 아이디
        password='password', # MariaDB 비밀번호
        db = 'database_name', # MariaDB 데이터베이스명
        charset='utf8' )
        
        

 

 

 

Python으로 MariaDB에 연결하려하니 콘솔에 아래와 같은 에러로그를 출력한다.

 

 

#에러 로그
pymysql.err.OperationalError: (1044, "Access denied for user 'dev_kyome'@'%' to database 'database_name'")

 

 

 

 

 

 

 

dev_kyome라는 계정이 데이터베이스에 접근할 권한이 없기 때문이다.

 

 

 

-- dev_kyome 사용자에게 권한을 부여한다.
-- GRANT ALL PRIVILEGES ON ~~로 해서 전체 권한을 줄 수도 있지만,
-- 개발용 계정이 너무 많은 권한을 갖고 있을 필요가 없기 떄문에 DML만 주기로 했다.

GRANT DELETE, INSERT, SELECT, UPDATE ON database_name.* TO `dev_kyome`@`%` IDENTIFIED BY 'password';

-- `dev_kyome`@`%`  에서 @ 뒤는 접속하는 호스트를 말하는데, 
-- 외부에서 접속해서 조작할 수 있는 권한을 주기 위해서 
-- %로 외부에서 접속할 수 있게 설정해주었다.



-- 권한 확인하기 
SHOW GRANTS FOR 'dev_kyome'@'%';

-- 'dev_kyome'@'%' 설정했던 호스트를 입력해야지만 확인 가능하다.

+-------------------------------------------------------------------------------------------------------------+
| Grants for 'dev_kyome'@'%';                                                                                 |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dev_kyome'@'%' IDENTIFIED BY PASSWORD 'password'                                     |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `database_name`.* TO 'dev_kyome'@'%'                                |
+-------------------------------------------------------------------------------------------------------------+

 

 

 

 

 

데이터를 한번에 insert 하기위해 Python으로 MariaDB의 root 계정에 연결을 시도했다.

 

import pymysql.cursors

conn = pymysql.connect(
        host='aaaicu.synology.me', # MariaDB 서버
        user='root',  # MariaDB 아이디
        password='password', # MariaDB 비밀번호
        db = 'database_name', # MariaDB 데이터베이스명
        charset='utf8' )

 

그런데, 다음과 같은 에러 로그가 출력되었다.

 


pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'000.000.000.000' (using password: YES)")

 

 

 

 

 

root 계정접속이 외부호스트에서 막혀있기 때문이다.

액세스할 수 있도록 호스트를 설정해주지 않으면 localhost만 허용되기 때문에 외부에서 접속가능한 계정을 만들어 주거나 root의 설정을 수정을 해주어야한다

 

 

계정 생성하기

나는 root의 계정을 열어주기보단 외부에서 접속할 수 있는 계정을 열어 줄 생각이다.

create user `dev_kyome`@`%` identified by 'password';

‘생성할 계정명’@‘접속 호스트’ 로 생성 하면된다.

접속 호스트는 특정 IP를 입력해도 되고 도메인명을 입력해도 된다.

외부 어디서든 접속 가능하도록 만드려면 %를 입력하면 된다.

 

 

 

 

 

 

+ Recent posts

"여기"를 클릭하면 광고 제거.