(198)

강해져서 돌아온 ChatGPT에게 코딩을 시켜보자 (2)

https://koreanraichu.tistory.com/226 강해져서 돌아온 ChatGPT에게 코딩을 시켜보자 아니 자기가 강해져서 돌아왔대잖아요... 일단 이번에 시켜볼 것은 매우 간단한 코딩들... 뭐 import 할 수는 있겠지만 패키지 설치를 요하는 건 아닌, 그런 것들을 시켜볼거다. 여담이지만 오늘 제 koreanraichu.tistory.com 1편은 여기로 모시겠습니다 고객님. 저녁에는 좀 되는듯... 아까 서버 문제있었나? 근데 지금도 네트워크 에러가 간간이 일어나는게 얘네 서버실에 커피 엎은 것 같음. (아까 시키려던거) 입력받은 문자열 출력하기 input_string = input("문자열을 입력하세요: ") print("입력한 문자열은", input_string, "입니다.") ..

강해져서 돌아온 ChatGPT에게 코딩을 시켜보자

아니 자기가 강해져서 돌아왔대잖아요... 일단 이번에 시켜볼 것은 매우 간단한 코딩들... 뭐 import 할 수는 있겠지만 패키지 설치를 요하는 건 아닌, 그런 것들을 시켜볼거다. 여담이지만 오늘 제일 많이 본 것은... 강해져서 돌아왔다며!!! Hello, World! 출력하기 print("Hello, World!") 프로그래밍 책에서도 첫빠따로 나오는 헬로월드다. 따옴표는 ""도 되고 ''도 되는데 아무튼 저 코드 자체는 잘 됐음. 일차원 배열 만들기 반복문을 사용하지 않고 a = [1,2,3,4,5] 이런 식으로 직접 할당하는 배열 말하는거다. my_list = [i for i in range(1, 6)] print(my_list) 오 고급기술... 원래 의도했던 건 a = [1,2,3,4,5]였..

백준 2587번 풀이

문제 https://www.acmicpc.net/problem/2587 2587번: 대표값2 어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 + www.acmicpc.net 숫자 다섯개가 들어오는데 이제 평균이랑 중앙값을 출력해야 한다. 풀이 일단 이거는 예전에 풀었던 엑셀은 장식이 아닙니다 휴먼 문제(번호는 까먹었는데 풀면서 이럴거면 엑셀 쓰지 싶었음)보다는 쉽다. 일단 입력이 딱 다섯개인데 되게 정직하게 한줄씩 받는 시점에서 쉽지. import sys number_list = [] for i in range(5): num..

백준 2738번 풀이

문제 https://www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같 www.acmicpc.net 행렬 덧셈 구하는 문제. 이러다 곱하기 나오는거 아니냐 Reference [python] 2차원 리스트 생성 및 입력 받기, 원하는 값 찾기, 탐색, 전치 행렬 (tistory.com) [python] 2차원 리스트 생성 및 입력 받기, 원하는 값 찾기, 탐색, 전치 행렬 '본 포스팅은 글쓴이 개인의 공부 목적이므로, 틀린 부분이 있다면 댓글로 달아주시면 감사하겠습니다.' 오늘..

백준 5597번 풀이

문제 https://www.acmicpc.net/problem/5597 5597번: 과제 안 내신 분..? X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데, www.acmicpc.net 과제 안 낸 사람 출석번호를 낮은 순서대로 두개 뽑으면 된다. (근데 어차피 비는거 두개임) 풀이 자 이것도 투트랙은 투트랙인데... 입력을 너무 정직하게 28줄 받는다... 이러면 귀찮음... 그래서 로직 테스트는 small scale로 줄여서 했다. import sys student_list = [i for i in range(1,31)] gwaje_list = [] for ..

백준 10807번 풀이

문제 https://www.acmicpc.net/problem/10807 10807번: 개수 세기 첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거 www.acmicpc.net 숫자가 왕창 든 배열에서 특정 숫자를 찾아서 세면 된다. 풀이 이 문제는 크게 투트랙인데 일단 숫자 배열을 생성하고 그 다음 세면 된다. 근데 쉽다. 농담 아니고 진짜 쉽다. import sys N = int(sys.stdin.readline()) N_list = list(map(int, sys.stdin.readline().split())) # 배열 길이와 안에 들어가는 숫자들..

백준 10815번 풀이

문제 https://www.acmicpc.net/problem/10815 10815번: 숫자 카드 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 숫자 카드 목록에 찾고자 하는 숫자가 있는지 확인하고, 결과를 0 or 1로 출력하는 문제. 풀이 일단 이 문제의 입력 인자는 네 개다. 카드 개수, 카드 숫자, 찾을 개수, 찾을 숫자. 그래서 입력을 정직하게 네 줄로 받는다. N = int(sys.stdin.readline()) card_N = list(map(int, sys.stdin.readline().s..

백준 1620번 풀이

문제 https://www.acmicpc.net/problem/1620 1620번: 나는야 포켓몬 마스터 이다솜 첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 www.acmicpc.net 포켓몬 전국도감 번호->이름/이름->전국도감 번호 말하기. (입력 순서가 일단 전국도감 아니면 관동 도감같은데...) Reference https://seraup.dev/10 백준 1620번 나는야 포켓몬 마스터 이다솜 (Python) 문제 포켓몬의 수 N, 내가 맞춰야하는 문제의 수 M. N개의 줄에 포켓몬의 이름이 입력으로 들어옴. 그 다음 줄부터 M개의 줄에..

백준 18870번 풀이

문제 https://www.acmicpc.net/problem/18870 18870번: 좌표 압축 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌 www.acmicpc.net 입력받은 수직선상의 좌표를 압축한 값을 출력하시오(라는데 이해가 안된다...) Reference https://eunhee-programming.tistory.com/116 코딩테스트 준비 - 백준18870번 좌표압축 풀이:파이썬 딕셔너리 활용 (파이썬) 백준 18870번 풀이 문제풀러가기 https://www.acmicpc.net/probl..

백준 10814번 풀이

문제 https://www.acmicpc.net/problem/10814 10814번: 나이순 정렬 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 www.acmicpc.net 회원 정보를 나이순으로 정렬하되, 이름 순서는 바뀌지 않도록 하시오. Reference https://velog.io/@good159897/%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%AC-VS-%EB%B6%88%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%AC-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%E..

백준 1181번 풀이

문제 https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 주어진 영단어를 주어진 순서대로 정렬하는 문제 풀이 자 일단 이 문제를 풀기 위해서는 총 두가지를 해야 한다. 중복되는 단어를 없앤 다음 주어진 순서대로 정렬하는 것. 리스트 출력은 별개로 둡시다... 엥? 중복 단어요? 그걸 어떻게 가려내죠? 사람이 일일이 인덱싱 해야 하나요? 에이 그런 노가다 안해도 됨. 파이썬에는 세트(set)라는 매우 좋은 형태가 있다. 세트는 안에 든 것..

Python으로 60갑자 뽑기

참고로 60갑자가 뭔지 궁금하면 달력을 보자. 올해는 임인년이라 인월 인일 인시에 사인검 하나 나온다. (인년 인월 인일 인시 해서 사인이라 사인검이다) 60갑자는 천간 10개와 지지 12개로 이루어지는데... 어? 뭐임? 하나 할인해요? ㄴㄴ 10과 12의 최소공배수가 60임다. 천간: 갑을병정무기경신임계 지지: 자축인묘진사오미신유술해 이렇게 된다. 뒤에 있는 지지가 여러분의 띠이기도 하다. 내가 태어나는 해에도 당연히 갑자가 있고 이게 60년마다 한번씩 돌아오기 때문에 환갑 = 61세(만 60세)에 치른다. 또한 지지가 12개이기때문에 띠동갑은 12살이다. cheongan = ['갑','을','병','정','무','기','경','신','임','계'] * 12 gigi = ['자','축','인','묘'..

백준 11650, 11651번 풀이

문제 https://www.acmicpc.net/problem/11650 11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. www.acmicpc.net https://www.acmicpc.net/problem/11651 11651번: 좌표 정렬하기 2 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다...

백준 25501번 풀이

문제 https://www.acmicpc.net/problem/25501 25501번: 재귀의 귀재 각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다. www.acmicpc.net 회문 판독을 재귀함수로 한다. 문제 제목도 회문. Reference https://my-coding-notes.tistory.com/580 [🥉2 / 백준 25501 / 파이썬] 재귀의 귀재 25501번: 재귀의 귀재 각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다. www.acmicpc.net 문제 정휘는 후배들이 재귀 함수를 잘 다루 my-coding-no..

RE with FLASK-유효성 검사

예전에 익스트림 CRUD에 나왔던 그거 맞다. 대신 익스트림 CRUD에 비해 입력받는 항목도 적고, 형식검사도 한 가지 부분에 대해서만 진행하면 되기때문에 코드가 비교적 간소하다. 입력인자 중 공백 여부를 체크할 것은 1. 시퀀스 2. 시퀀스 이름 3. 시퀀스 정보 이고, 형식을 체크할 것은 시퀀스 하나뿐이다. DNA는 다들 아시다시피 A, T, G, C로 구성되어 있고 DNA 시퀀스에도 당연히 A, T, G, C만 들어간다. 대소문자 입력을 감안해도 atgcATGC 이렇게 여덟개다. 어? 제한효소 인식 시퀀스에는 W나 N같은 것도 있잖아요! 그건 DNA 시퀀스가 문제가 아니라 그 제한효소가 인식하는 염기가 두 개 이상이라는 소리다. 예를 들어서 GGWCC라는 인식 시퀀스를 가지는 제한효소가 있다면, 이..

강해져서 돌아온 ChatGPT에게 코딩을 시켜보자 (2)

Coding/Python 2023. 3. 20. 23:51

https://koreanraichu.tistory.com/226

 

강해져서 돌아온 ChatGPT에게 코딩을 시켜보자

아니 자기가 강해져서 돌아왔대잖아요... 일단 이번에 시켜볼 것은 매우 간단한 코딩들... 뭐 import 할 수는 있겠지만 패키지 설치를 요하는 건 아닌, 그런 것들을 시켜볼거다. 여담이지만 오늘 제

koreanraichu.tistory.com

1편은 여기로 모시겠습니다 고객님. 

 

저녁에는 좀 되는듯... 아까 서버 문제있었나? 근데 지금도 네트워크 에러가 간간이 일어나는게 얘네 서버실에 커피 엎은 것 같음.


(아까 시키려던거) 입력받은 문자열 출력하기

input_string = input("문자열을 입력하세요: ")
print("입력한 문자열은", input_string, "입니다.")

가장 간단한 방식은 input()이지만, 사실 내가 알고싶은 건 이게 아니였다... 그럼 본론으로 들어가서 물어봅시다.

 

import sys

input_string = sys.stdin.readline().rstrip()  # 입력받은 문자열에서 개행 문자 제거
print("입력한 문자열은", input_string, "입니다.")

설명까지 잘 보면 알겠지만 sys.stdin.readline()이 input보다 빠른 대신 포기한 두가지 중 한가지(개행문자 안뗌)에 대해 언급하고 있다. 또한 sys.stdin.readline()을 이용하려면 import sys가 우선시되어야 하는 것도 잘 알고 있다.

 

2차원 배열 만들기

1차원 배열은 1편에서 만들었던 리스트가 1차원 배열이고, 2차원 배열은 그거 여러개를 나열해둔 것이라고 보면 된다. 일반적으로 생각하는 점(0차원)->선(1차원)->면(2차원)->입체(3차원)로 확장하는 것과 비슷한데, 리스트를 쌓으면 2차원 배열, 2차원 배열을 쭉 쌓으면 3차원 배열이 된다.

 

일단 첫번째로는 1부터 25까지 순차적으로 들어가는 5*5 배열을 만들어보자.

네트워크 에러가 뜬 후 한번 다시 만들어서 출력이 다르다. 처음 만들어 준 코드는 아래 코드가 맞다.

# 5x5 크기의 2차원 배열 생성
array_2d = []
for i in range(5):
    row = []
    for j in range(5):
        row.append(i*5 + j + 1)
    array_2d.append(row)

# 2차원 배열 출력
for row in array_2d:
    print(row)

네트워크 에러가 떠서 확인해보려고 미리 코드만 복사했었는데 2차원 배열을 생성하는 것 뿐 아니라 보기 좋게 출력하는 방법까지 제시하고 있다. 이게 왜 중요하냐면 저 코드에서 그냥 print(array_2d)로 하게 되면

[[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]]

솔직히 저거 5*5 배열이니까 스무스하게 넘어가는거지 8*8이나 9*9배열에서 이렇게 출력했다간 욕 바가지로 먹고 여러분들 불로장생 할 수도 있음... 진짜로.

 

그럼 이번에는 리스트 컴프리헨션으로 정사각형 배열이 아닌 직사각형 배열을 만들어보자.

array_2d = [[j + 1 + i * 8 for j in range(8)] for i in range(6)]
print(array_2d)

역시나 좀 더 깔끔하게 뽑고 싶다면 for문을 사용하면 된다. 이 방식은 위처럼 2차원 배열을 만드는 건 동일한데, for문 두개+몇줄을 차지하던 걸 리스트 컴프리헨션으로 한 줄로 깔끔하게 줄여버린 것.

 

함수 정의하기

함수 정의가 뭐냐면 def 어쩌고로 정의하는 그거다. 근데 얘네 서버실에 진짜 누가 커피라도 쏟은건가... 에러때문에 뭘 제대로 할 수가 없음.

def add_subtract(x, y):
    # 합 계산
    add = x + y
    # 차 계산
    subtract = x - y
    # 결과 출력
    print("합:", add)
    print("차:", subtract)

간단한 함수의 정의도 매우 잘 한다. 합, 차를 구하는 함수를 만들어달래서 print문까지 같이 준건데 합따로 차따로 하는거면 리턴으로 반환했을지도...?

 

별찍기

for i in range(1, 8):
    print("*" * i)

어... 이것도 별찍기 맞긴 맞는데... 그 가운데정렬은 뭐라고 해야 됨?

 

for i in range(1, 8):
    print(" " * (7-i) + "*" * (2*i-1))

정답: 피라미드

 

배열 탐색

이건 뭐냐면 난수 10개가 들어있는 1차원 배열에서 제일 큰 수를 찾는 방법을 묻는 것이다.

import random

# 1부터 100 사이의 랜덤한 숫자 10개를 가지는 리스트 생성
arr = [random.randint(1, 100) for _ in range(10)]

# 리스트에서 최댓값 찾기
max_num = max(arr)

print(arr)  # 리스트 출력
print("제일 큰 수:", max_num)  # 최댓값 출력

일단 여기서 두가지 짚고 넘어갈 게 있다. 첫번째로, 1편에서 리스트를 만들때는 리스트라고 했는데 이번에 질문할때는 랜덤한 숫자 10개가 들어간 1*10 '배열'이라고 했고 두번째로는 최댓값을 찾기 위해 적절한 모듈을 얘가 골라서 썼다는 것. 그럼 혹시 최댓값이 들어있는 '위치'를 출력할 수도 있는지 한번 보자. 이거 혹시 백준 빌드업? 

 

import random

# 1부터 100 사이의 랜덤한 숫자 10개를 가지는 리스트 생성
arr = [random.randint(1, 100) for _ in range(10)]

# 리스트에서 최댓값 찾기
max_num = max(arr)

# 최댓값이 있는 위치(인덱스) 찾기
max_index = arr.index(max_num)

print(arr)  # 리스트 출력
print("제일 큰 수:", max_num)  # 최댓값 출력
print("최댓값의 위치:", max_index+1)  # 최댓값의 위치(인덱스+1) 출력

2차원 배열에서 어떻게 하는지까지 물어보면 ㄹㅇ 백준 빌드업 되니까 패스... 근데 값을 넣고 인덱스 찾는 법이 있긴 있었구나... 했는데 저거 문자열에서 찾는거네???

 

정렬 알고리즘

이게 종류가 많은데 일일이 다 하다간 서버 뻑나서 내 혈압이 오를 것 같으니 병합정렬이랑 퀵, 힙, 트리(이진 트리를 만들어서 정렬한다는데 뭔지 궁금했음)만 해보자. (당연하지만 2차원 배열에는 안통함)

 

병합 정렬

import random

def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]

    left = merge_sort(left)
    right = merge_sort(right)

    return merge(left, right)

def merge(left, right):
    result = []
    i, j = 0, 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    if i < len(left):
        result += left[i:]
    if j < len(right):
        result += right[j:]

    return result

arr = [random.randint(1, 100) for _ in range(10)]
print("Before sort:", arr)

sorted_arr = merge_sort(arr)
print("After sort:", sorted_arr)

본문

병합정렬(merge sort)은 분할정복(divide and conquer) 알고리즘 중 하나로, 배열을 반으로 나눈 뒤, 나눈 각 부분을 재귀적으로 정렬하고, 그 결과를 병합하여 전체를 정렬하는 알고리즘입니다.

 

파이썬에서는 sorted() 함수를 사용하면 간단하게 정렬할 수 있습니다.

하지만, 이번에는 병합정렬을 직접 구현하여 1부터 100까지 중 랜덤한 숫자 10개가 있는 1*10의 배열을 정렬해보겠습니다.

위 코드에서 merge_sort() 함수는 재귀적으로 호출하여 배열을 반으로 나누고, merge() 함수를 사용하여 각 부분 배열을 정렬하여 병합하는 과정을 거칩니다.

merge() 함수는 각 부분 배열을 정렬하여 병합하며, 두 배열을 비교하여 작은 값을 결과 리스트에 추가하고, 마지막에 남은 부분 배열을 추가합니다.

위 코드를 실행하면, 1부터 100까지 중 랜덤한 숫자 10개가 있는 배열이 생성되어 출력되고, 병합정렬을 거친 후 정렬된 배열이 출력됩니다.

이게 일단 길어서 화면 캡처가 안되고... 돌려봤는데 정렬이 깔-끔하다. 스크롤 캡처 해보려고 했는데 일단 전체샷만 찍히고(시종점을 정할수가 없음) 괴랄하게 찍혀서 차라리 내가 하는게 낫겠다 수준이었음.

 

퀵 정렬

import random

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr)//2]
    less, equal, greater = [], [], []
    for num in arr:
        if num < pivot:
            less.append(num)
        elif num == pivot:
            equal.append(num)
        else:
            greater.append(num)
    return quick_sort(less) + equal + quick_sort(greater)

arr = [random.randint(1, 100) for _ in range(10)]
print("Before sorting:", arr)
arr = quick_sort(arr)
print("After sorting:", arr)

근데 이게 하다보니까 단점이라고 할 것까지는 아닌데, 보통 예시 코드로 설명해줄때는 중간과정을 출력하게끔 하는데 얘는 그런거 없다. 과정샷? 주문해야 나올듯...

 

힙 정렬

나도 뭔지는 모름... 힙 트리를 이용한다는데...

import heapq
import random

# 1부터 100까지 중 랜덤한 숫자 10개로 이루어진 리스트 생성
lst = random.sample(range(1, 101), 10)

# heapq 모듈을 사용하여 힙 정렬 실행
heapq.heapify(lst)
sorted_lst = []
for i in range(len(lst)):
    sorted_lst.append(heapq.heappop(lst))

print(sorted_lst)

이 힙이 두 종류인데 하나는 맥스 힙(최대 힙)이라고 해서 루트가 항상 제일 큰 거, 반대로 민 힙(최소 힙)이라고 해서 루트가 항상 제일 작은 게 있다. 근데 이렇게 얘기하면 루트? 트리 아래요? 아뇨 그 가운데 하나짜리. 맨 위에놈.

 

트리 정렬

배열로도 구현은 가능한데 배열이 커질수록 시간이 기하급수적으로 늘어나기때문에 비추라고 한다. (나도 이거 처음봤음)

 

총평의 총평

원하는 조건이나 알고리즘같은 것만 설명 잘 하면 쓸만한데 문제가 두 가지 있었다. 첫번째로 얘 종특인데 한글로 입력하면 응답이 느려서 그 시간에 차라리 내가 구글링하는게 더 빠르게 생겼고, 두번째로 오늘 전체적으로 서버가 개판인건지 누가 서버실에 커피를 엎었는지 느린 응답과 시너지를 이뤄서, 겨우겨우 응답하나 했더니 오류야. 야이씨 이럴바엔 내가 하고 말지가 되었다.

 

결론은 한국어가 좀 느린거 감수하면 쓸만한데 서버 상태가 멀쩡하기를 기도하고 쓰자.

Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

강해져서 돌아온 ChatGPT에게 코딩을 시켜보자

Coding/Python 2023. 3. 20. 18:40

아니 자기가 강해져서 돌아왔대잖아요...


일단 이번에 시켜볼 것은 매우 간단한 코딩들... 뭐 import 할 수는 있겠지만 패키지 설치를 요하는 건 아닌, 그런 것들을 시켜볼거다.

여담이지만 오늘 제일 많이 본 것은... 

강해져서 돌아왔다며!!! 


Hello, World! 출력하기

 

print("Hello, World!")

프로그래밍 책에서도 첫빠따로 나오는 헬로월드다. 따옴표는 ""도 되고 ''도 되는데 아무튼 저 코드 자체는 잘 됐음.

 

일차원 배열 만들기

반복문을 사용하지 않고 a = [1,2,3,4,5] 이런 식으로 직접 할당하는 배열 말하는거다.

my_list = [i for i in range(1, 6)]
print(my_list)

오 고급기술... 원래 의도했던 건 a = [1,2,3,4,5]였는데 이것도 일단 맞는 방법이다. 컴프리헨션에 익숙해지면 이게 훨씬 더 편하기도 하고.

 

그럼 위에 있는 리스트 컴프리헨션을 조금 응용해보자. 이번에는 리스트 컴프리헨션으로 1부터 20까지의 수 중 소수만 배열에 소(별)장 해보도록 했다.

prime_list = [num for num in range(2, 21) if all(num % i != 0 for i in range(2, num))]
print(prime_list)

def로 따로 함수를 밖에서 정의하는 방식이 아니라 안에서 걍 함수까지 정의해버렸다. 예전에 본인이 예시로 했던 건

def isprime(a):
    sqrt = int(a ** 0.5)
    if a <= 1: 
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True
# a == 1을 a <= 1로 바꿨다. 
a = [i for i in range(100) if isprime(i)]
print(a)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

이런 식이었다. isprime이 소수 판별 함수이고 밖에서 정의를 해서 안에 굳이 정의 안했음.

 

반복문(for&while)

여기서는 더 재볼 것도 없이 2^1~2^10을 반복문을 이용해서 배열로 만들어 볼 예정이다. for랑 while 둘 다.

 

근데 내 질문에 뭐 문제 있나? 

 

my_list = []
for i in range(1, 11):
    my_list.append(2 ** i)
print(my_list)

for는 여부터 여까지 반복하슈라는 반복문이라 걍 이렇게 하면 2부터 1024까지 등비수열로 나온다. 그냥 배열로 만들어달라고 했을 때는 리스트 컴프리헨션을 썼었는데 지금은 내가 for문으로 해달라고 주문한 것임.

 

my_list = []
i = 1
while i <= 10:
    my_list.append(2 ** i)
    i += 1
print(my_list)

while문은 for문과 달리 어떤 조건을 만족할때까지 뺑뺑이를 도는거라고 보면 된다. 그리고 ChatGPT는 for와 while의 맥락이 서로 다른것도 이해하고 있었다. 근데 에러 슈밤...

 

그럼 마지막으로 while True:를 출동시켜봅시다. 에러 몇번뜨나 봐야지 

my_list = []
i = 1
while True:
    my_list.append(2 ** i)
    i += 1
    if i > 10:
        break
print(my_list)

와일트루에 콜론 다니까 에러뜨는거 실화냐... 5트만에 성공함 ㅋㅋㅋㅋㅋㅋ 아무튼... 아일트루는 무한뺑뺑이라 특정 조건을 만족하면 나가게끔 조건을 정해줘야 한다. 일단 세가지 코드는 다 이상 무.

 

입력 받기

입력 받고 문구 출력만 하면 땡인데, 파이썬에는 방법이 두 가지 있다. 바로 input()과 sys.stdin.readline(). 과연 ChatGPT는 import sys를 할 수 있을 것인가? (sys.stdin.readline() 하려면 필요함)

 

일단 결론부터 말하자면 못했다. 자꾸 에러가 뜨더니 접속이 아예 안되는데 서버가 터진건지;;

 

총평

일단 밥이 걸려있으니 저녁에 후속 질문할 것을 정리해보자면


1) 위에 4번
2) 2차원 배열 만들기
3) 함수 정의하기
4) 별찍기


이정도..

전에 ChatGPT vs Bing에서도 얘기했듯이 기본적으로 얘는 한글로 입력하면 느려진다. 근데 에러까지 떠서 실질적으로 걸리는 시간이 훨배 느려졌다. 심지어 이거 되게 기초적인 부분이라 구글링 하거나 책 찾아보고 해도 기본적인 응답 시간에 비해 빠르고 어느정도 백그라운드가 있다면 물어볼 시간에 직접 코딩하는 편이 더 빠르다. 배우는 입장에서 궁금해서 코딩 맡겨보는거면 몰라도 업무때문에 그러는거면 걍 구글링 하던가 수제로 코딩하자. 에러 자체는 ChatGPT의 문제라기보단 서버 문제로 보인다. (인공지능은 서버든 본인 컴퓨터든 어따 모셔놓고 쓴다)

Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2587번 풀이

BOJ/[BOJ] Python 2022. 11. 15. 23:14

문제

https://www.acmicpc.net/problem/2587

 

2587번: 대표값2

어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 +

www.acmicpc.net

숫자 다섯개가 들어오는데 이제 평균이랑 중앙값을 출력해야 한다.

 

풀이

일단 이거는 예전에 풀었던 엑셀은 장식이 아닙니다 휴먼 문제(번호는 까먹었는데 풀면서 이럴거면 엑셀 쓰지 싶었음)보다는 쉽다. 일단 입력이 딱 다섯개인데 되게 정직하게 한줄씩 받는 시점에서 쉽지. 

 

import sys

number_list = []

for i in range(5):
    number = int(sys.stdin.readline())
    number_list.append(number)

이렇게만 하면 배열에 숫자까지 깔끔하게 패킹이 되는데... 이제 그럼 평균을 어떻게 구하져? 저건 산술평균, 그니까 엑셀에서 average() 치면 계산해주는 그 평균이 맞다. 그럼 파이썬에도 그런게 있나요? ㄴㄴ 없음.

average = sum(number_list) // 5

print(average)

그니까 걍 통으로 더해서 5로 나누면 되는데... 잘 보니까 슬래시가 두개네??? 아닛 나누기는 슬래시 하나자나여! 에잇 난 하나쓸거임 하면

???: YOU JUST ACTIVATED MY TRAP CARD (브금은 셀프)

 

나누기는 /가 맞다. 근데 문제를 잘 보면 출력값(평균/중앙값)이 다 '자연수'라고 되어있다. 그게 근데 슬래시 두개 쓰는 이유가 되냐고? 그럼 슬래시를 하나 쓰면 어떻게 되는지 보면 되지. 

average = sum(number_list) / 5

위에 다섯개는 입력값이고 저 밑에 32(32.0)가 평균인데 문제가 하나 있다. 저거 분명 나눠떨어지는데 .0을 달고 나와요... 저거 int 아니고 float여... 그러면 int로 변환하든가 아예 소수점 떼버리고 몫만 받게 슬래시 두번 그어야된다. 사실 나도 테스트하면서 알았음... ㅋㅋㅋㅋㅋㅋ

 

중앙값은 저거보다 더 간단해서 연산이고 자시고 필요 없다. 그냥 리스트정렬하고 가운데 값 뽑으면 되니까

print(number_list[2])

정렬한 리스트에서 인덱싱해서 가운데 값 뽑자. 여기서 중요한건 컴퓨터는 0부터 세기 때문에 길이가 5인 배열에서 가운데는 2번이 된다는 것. (배열 길이가 5로 고정되어있다)

 

import sys

number_list = []

for i in range(5):
    number = int(sys.stdin.readline())
    number_list.append(number)

number_list.sort()

average = sum(number_list) // 5

print(average)
print(number_list[2])

그래서 이거 내면 된다.

 

아, 이차원 배열 파트? 그거 일단 문제 풀려고 어제 봤는데 뇌 블루스크린 뜸...

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 25314번 풀이  (0) 2023.05.28
백준 11382번 풀이  (0) 2023.05.28
백준 2738번 풀이  (0) 2022.11.14
백준 5597번 풀이  (0) 2022.11.13
백준 10807번 풀이  (0) 2022.11.13
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 2738번 풀이

BOJ/[BOJ] Python 2022. 11. 14. 23:30

문제

https://www.acmicpc.net/problem/2738

 

2738번: 행렬 덧셈

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같

www.acmicpc.net

행렬 덧셈 구하는 문제. 이러다 곱하기 나오는거 아니냐 

 

Reference

[python] 2차원 리스트 생성 및 입력 받기, 원하는 값 찾기, 탐색, 전치 행렬 (tistory.com)

 

[python] 2차원 리스트 생성 및 입력 받기, 원하는 값 찾기, 탐색, 전치 행렬

'본 포스팅은 글쓴이 개인의 공부 목적이므로, 틀린 부분이 있다면 댓글로 달아주시면 감사하겠습니다.' 오늘은 2차원 리스트에 대해 알아보겠다. 1. 2차원 리스트의 구조 2차원 리스트는 1차원

minjoos.tistory.com

https://develop247.tistory.com/93

 

[파이썬/Python] 백준 2738번 행렬 덧셈

[파이썬/Python] 백준 2738번 행렬 덧셈 www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개

develop247.tistory.com

 

풀이

이거 진짜 잘못하면 곱하기 나오것다... 아무튼. 행렬의 덧셈은 개 심플한데 걍 행렬 두개를 더하면 된다. 좌표 상응하는거 걍 더하고 빼면 떙인데 이제 곱하기 나누기 들어가면 골치아픔... 아무튼. 이런 행렬의 연산은 두 행렬의 크기가 같다는 전제 하에 진행된다. 그래서 1+1로 받는건가 

 

일단 행렬을 생성하는 방법은 간단하다. 아니 넘파이 치워봐 백준에서 넘파이 못써...

 

import sys

array = [[i for i in range(3,10,3)] for j in range(3)]

print(array)
import sys

M, N = map(int,sys.stdin.readline().split())

array = [[i for i in range(M)] for j in range(N)]

print(array)

이런 식으로 리스트 컴프리헨션으로도 입력받아서 만들 수 있다. 근데 저거 어떻게 하나 찾아봤더니 죄다 1차원 리스트만 있자나...

 

아무튼 이 문제는 저걸 기반으로 풀긴 풀어야 하는데, 입력받을 때 두 가지를 고려해야 한다. 첫번째로 행단위로 행렬 원소를 입력받는다는것과 그 행렬 입력이 1+1이라는 것... 아니 농담 아니고 진짜 1+1이여... 한번에 두개 다받음...

 

import sys

M, N = map(int,sys.stdin.readline().split())

array = [0 for i in range(N)]
array2 = [0 for i in range(N)]
array_sum = [[j for j in range(M)] for i in range(N)]

for i in range(N): 
    array[i] = list(map(int, sys.stdin.readline().split()))

for i in range(N):
    array2[i] = list(map(int, sys.stdin.readline().split()))

for i in range(N):
    for j in range(M):
        array_sum[i][j] = array[i][j] + array2[i][j]

for i in array_sum:
    for j in i:
        print(j,end=" ")
    print("")

그래서 이렇게 했는데 런타임에러 뜨더라니까. 혹시 왜 뜨는지 아시는 분은 제보 바랍니다. (백준은 에러가 떠도 무슨 행에서 뜨는지는 안 알려줌)

 

import sys

N,M = map(int,sys.stdin.readline().split())

array = []
array2 = []

for i in range(N):
    i = list(map(int, sys.stdin.readline().split()))
    array.append(i)

for i in range(N):
    i = list(map(int, sys.stdin.readline().split()))
    array2.append(i)

for x in range(N):
    for y in range(M):
        print(array[x][y] + array2[x][y], end=' ')
    print()

이건 참고문헌에 있는 코드고

import sys

N,M = map(int,sys.stdin.readline().split())

array3 = [i for i in range(N)]
array4 = [i for i in range(N)]

for i in range(N):
    array3[i] = list(map(int, sys.stdin.readline().split()))

for i in range(N):
    array4[i] = list(map(int, sys.stdin.readline().split()))

for x in range(N):
    for y in range(M):
        print(array3[x][y] + array4[x][y], end=' ')
    print()

컴프리헨션 이걸로 썼음(N만큼 일차원 배열을 만들고 일차원 배열 안에 리스트를 넣으면 2차원 배열이 된다)

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 11382번 풀이  (0) 2023.05.28
백준 2587번 풀이  (0) 2022.11.15
백준 5597번 풀이  (0) 2022.11.13
백준 10807번 풀이  (0) 2022.11.13
백준 10815번 풀이  (0) 2022.10.12
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 5597번 풀이

BOJ/[BOJ] Python 2022. 11. 13. 23:02

문제

https://www.acmicpc.net/problem/5597

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

과제 안 낸 사람 출석번호를 낮은 순서대로 두개 뽑으면 된다. (근데 어차피 비는거 두개임)

 

풀이

자 이것도 투트랙은 투트랙인데... 입력을 너무 정직하게 28줄 받는다... 이러면 귀찮음... 그래서 로직 테스트는 small scale로 줄여서 했다.

 

import sys

student_list = [i for i in range(1,31)]
gwaje_list = []

for i in range(28):
    N = int(sys.stdin.readline())
    gwaje_list.append(N)

gwaje_list.sort()

일단 배열 생성하고 입력받는 부분은 이렇다. 그리고 과제 안 낸 학생을 찾을건데 이걸 어떻게 찾냐... 보면 리스트가 두 개 있는데 우리가 입력받는 리스트는 과제 리스트(과제 제출한 사람)고, 위에 스튜던트 리스트는 전체 학생 리스트이다. 즉, 전체 학생 리스트에서 과제 리스트를 조회해서 없는 번호를 출력할거다.

그럼 순서가 낮은 순인데 그건 어떻게 하냐고? 그래서 정렬했음.

 

for i in student_list:
    if i in gwaje_list:
        continue
    else: 
        print(i)

학생 리스트의 요소가 과제 리스트에 없으면 그건 안 낸거다. (끄덕)

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2587번 풀이  (0) 2022.11.15
백준 2738번 풀이  (0) 2022.11.14
백준 10807번 풀이  (0) 2022.11.13
백준 10815번 풀이  (0) 2022.10.12
백준 1620번 풀이  (0) 2022.09.30
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 10807번 풀이

BOJ/[BOJ] Python 2022. 11. 13. 22:36

문제

https://www.acmicpc.net/problem/10807

 

10807번: 개수 세기

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거

www.acmicpc.net

숫자가 왕창 든 배열에서 특정 숫자를 찾아서 세면 된다.

 

풀이

이 문제는 크게 투트랙인데 일단 숫자 배열을 생성하고 그 다음 세면 된다. 근데 쉽다. 농담 아니고 진짜 쉽다.

 

import sys
N = int(sys.stdin.readline())
N_list = list(map(int, sys.stdin.readline().split()))
# 배열 길이와 안에 들어가는 숫자들
v = int(sys.stdin.readline())
# 셀거

입력은 정직하게 세 줄 딱 받으면 되고, 배열은 map으로 만들면 된다. 

 

그러면 여기서 어떻게 하느냐... 짬에서 나오는 바이브가 있는 우리의 코더분들은 아 쉽지 쓱 땡이지만 응애 나 애기코더! 이신 분들은 그렇지 않잖아요...? 헐 이거 뭐 함수 써야돼요? ㄴㄴ 그런거 없음.

import sys
N = int(sys.stdin.readline())
N_list = list(map(int, sys.stdin.readline().split()))
# 배열 길이와 안에 들어가는 숫자들
v = int(sys.stdin.readline())
# 셀거

cnt = 0
for i in N_list:
    if i == v:
        cnt += 1
    else: 
        pass

print(cnt)

그냥 cnt 배열 만들고 배열 순회하면서 찾는거랑 같은거 있으면 1씩 더한 다음 최종적으로 그거 출력하면 된다. 1차원 배열 파트에서 제일 쉬운 문제기때문에 뭐 함정카드 이딴것도 없다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2738번 풀이  (0) 2022.11.14
백준 5597번 풀이  (0) 2022.11.13
백준 10815번 풀이  (0) 2022.10.12
백준 1620번 풀이  (0) 2022.09.30
백준 18870번 풀이  (0) 2022.09.30
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 10815번 풀이

BOJ/[BOJ] Python 2022. 10. 12. 03:11

문제

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

숫자 카드 목록에 찾고자 하는 숫자가 있는지 확인하고, 결과를 0 or 1로 출력하는 문제.

 

풀이

일단 이 문제의 입력 인자는 네 개다. 카드 개수, 카드 숫자, 찾을 개수, 찾을 숫자. 그래서 입력을 정직하게 네 줄로 받는다.

 

N = int(sys.stdin.readline())
card_N = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
find_M = list(map(int, sys.stdin.readline().split()))
# 순서대로 카드 장 수/카드/찾을 숫자 개수/찾을 숫자

내가 네 줄 받는다고 했잖아요...

 

그리고 이 문제를 풀기 전에 해야 할 게 두 가지 있다. 첫번째로, 이진 탐색 함수를 정의해야 한다.

def binary_search(target,array):
    left = 0
    right = len(array) - 1

    while left <= right:
        middle = (left + right) // 2
        if array[middle] == target:
            index = middle + 1
            return index
            break
        elif array[middle] > target:
            right = middle - 1
        else: 
            left = middle + 1

이거 정의하면 되고... 아뇨 리턴은 상관 없으니까 걍 정의하시면 됩니다. 그리고 전에 이진 탐색 알고리즘과 정렬 알고리즘에 대해 설명하면서 '정렬 알고리즘을 써서 정렬을 해야 이진 탐색 알고리즘으로 빨리 찾을 수 있다'고 했는데... 이쯤되면 감이 오시겠지만, 리스트 정렬을 해야 한다.

card_N.sort()

그니까 이거. 

 

for i in find_M:
    if binary_search(i,card_N) == None:
        print("0",end=" ")
    else:
        print("1",end=" ")

저 함수를 돌렸을 때 뭔가 있다면 Index를 반환하지만, 찾고자 하는 값이 없으면 None을 반환하게 된다. 즉, 함수 돌려서 None이면 없는거고 다른 뭔가가 나온다면 있는거다. 그래서 이 조건문을 fimd_M(찾을 숫자 배열)만큼 돌리면 된다. 저거는 자바스크립트의 for of와 같은 것으로, 리스트에 직접 접근해서 리스트 요소를 쌩으로 가져온다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 5597번 풀이  (0) 2022.11.13
백준 10807번 풀이  (0) 2022.11.13
백준 1620번 풀이  (0) 2022.09.30
백준 18870번 풀이  (0) 2022.09.30
백준 10814번 풀이  (0) 2022.09.29
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1620번 풀이

BOJ/[BOJ] Python 2022. 9. 30. 01:08

문제

https://www.acmicpc.net/problem/1620

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

포켓몬 전국도감 번호->이름/이름->전국도감 번호 말하기. (입력 순서가 일단 전국도감 아니면 관동 도감같은데...)

 

Reference

https://seraup.dev/10

 

백준 1620번 나는야 포켓몬 마스터 이다솜 (Python)

문제 포켓몬의 수 N, 내가 맞춰야하는 문제의 수 M. N개의 줄에 포켓몬의 이름이 입력으로 들어옴. 그 다음 줄부터 M개의 줄에 맞춰야하는 문제가 입력으로 들어옴. 숫자로 들어오면 포켓몬 번호

seraup.dev

https://blockdmask.tistory.com/556

 

[python] 파이썬 isdigit 숫자 판별

안녕하세요. BlockDMask 입니다. 오늘은 파이썬에서 문자열이 숫자로 이루어졌는지 확인하는 isdigit 에 대해서 이야기해보려합니다. 파이썬 isdigit 설명 1-1) isdigit 설명 isdigit은 string 클래스에 있는

blockdmask.tistory.com

 

풀이

해시는 나도 뭔지 잘 모르는데 아무튼 빠르다고 한다. 그보다 일단 18년차 포덕으로서... 몇가지 정정하고 가도록 합시다... 문제적 허용으로 봐주세요 여러분.

 

1. 문제에 나온 도감 번호는 관동 도감으로 추정된다. (오박사가 아직 전국도감 안준듯)

2. 보통 리그에서 챔피언 뚝배기 깨면 전국도감으로 업그레이드는 걍 해준다. FRLG는 도감에 일정 마리수 이상 등록도 해야 하는데 BDSP는 걍 챔피언 깨니까 업글해줌. (물론 채우면 보상이 있다)

3. 7세대부터 인게임에서는 전국도감이 없어졌다. (BDSP의 경우 전국도감이 생기긴 했는데 5세대 이후로는 못 와서 의미가 없음) 7세대까지는 포켓몬 뱅크, 8세대부터는 포켓몬 홈에서 전국도감을 확인할 수 있다.

4. 스타팅으로 받자마자 솔라빔 쓰는 이상해씨는 없습니다... 보통 이런 고위력기 자력기로 배우려면 5~60 넘겨야 한다. 피카츄도 번개까지 배우고 라이츄 만들려면 63인가까지 키워야 한다. 피카츄가 물몸이라 사리 많이 적립된다 10만볼트 자력기로 가르치려면 라이츄 만들고 살리거나 피카츄 50대까지 쌩으로 키워야 한다. 아님 기술머신 쓰거나... 

5. 오바람(라이벌)이 스타팅으로 이브이를 가져가는 건 피카츄 버전입니다. 그리고 피카츄 버전은 저 그래픽으로 나온 게 없음. 최근 리메이크 되긴 했는데 그게 스위치 버전으로 렛츠고 피카브이 나온거라 3D 그래픽임. 그거랑은 별개로 스토리에서 이 고증은 어쨌든 잘 살린 게 맞음.

6. 전국도감이 지금 905마린가 906마린가 그래서 절대 문제에 뒷번호까지 못 나온다. (러브로스가 905번인가 그럼) 그리고 나도 다 못 외운다.

7. 다솜씨 그거 홈에서 모으면 500년 전 마기아나 줍니다. (일단 환상의 포켓몬 중 멜탄/멜메탈도 채워야 함) 다솜씨 포고 시작하겠네 

8. 1세대(+리메이크)는 주인공이 풀밭으로 나가려고 하면 어머 얘 밖은 위험하니 이걸 데려가렴 하면서 스타팅을 줍니다. (퀴즈 ㄴㄴ 밖은 위험하니 ㅇㅇ)

9. 본가는 스토리 라인상 스토리 초반에 리그장에 갈 일이 없다. 악의 조직 뚝배기 깨고 체육관 뚝배기 깨느라 바쁘다.

 

더 쓸 거 많은데 일단 문제 풀이도 해야 하니 여기까지 합시다. 

 

사실 나도 해시 테이블이 뭔지는 잘 모르는데 뭔가 되게 빨리 찾을 수 있는 모양이더라... 아, 이 문제에서 그래서 해시 테이블을 만드냐면 그건 아니고 딕셔너리로 풀 거다.

 

import sys

N, M = map(int, sys.stdin.readline().split())
pokemon_name = []
pokemon_dic = {}

N은 포켓몬 도감 딕셔너리(...) 그니까 관동도감 상위 n마리를 뜻하고, M은 거기서 문제가 몇 개냐를 얘기한다. 즉 N이 28이면 이상해씨~모래두지까지라는 얘기다. 뮤츠는요 150 치면 되지 않을까 이쯤되면 전국도감 크롤링 하는 게 빠를듯 

 

for i in range(N):
    pokemon = sys.stdin.readline().strip()
    pokemon_name.append(pokemon)
    pokemon_dic[pokemon] = i + 1

짜잔. 그래서 리스트와 딕셔너리가 나오는데요... 응? 그럼 리스트는 그저 딕셔너리의 중간과정에 불과한건가요? 놉, 그건 이따 설명해드림.

 

for _ in range(M):
    pokemon_find = sys.stdin.readline().strip()
    if pokemon_find.isdigit():
        print(pokemon_name[int(pokemon_find) - 1])
    else: 
        print(pokemon_dic[pokemon_find])

문제가 두 가지 케이스인데 포켓몬 이름을 말하면 도감번호를, 도감번호를 말하면 포켓몬 이름을 찾아야 한다. 포켓몬 이름을 말하면 도감번호를 반환하는 건 포켓몬 이름을 키로 검색해서 딕셔너리 밸류 뽑으면 되는데... 그럼 도감 번호는??? 헐 이거 밸류로 찾을 수 있어요? 아니 그래서 리스트가 필요한거임.

 

isdigit()는 입력값이 숫자인지를 확인해주는거기 때문에 알파벳이건 한글이건 빵상빵상이건 외계어건 마인크래프트어건 안농핫삼이건 문자열이 있으면 false다. 매우 순수하게 숫자만 있어야 True기 때문에 isdigit()이 true라는 건 숫자만 있다, 즉 도감 번호라는 얘기니까 정수형으로 변환한 다음 거기에 1을 빼서 인덱싱하면 된다. 참 쉽죠? 

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10807번 풀이  (0) 2022.11.13
백준 10815번 풀이  (0) 2022.10.12
백준 18870번 풀이  (0) 2022.09.30
백준 10814번 풀이  (0) 2022.09.29
백준 1181번 풀이  (0) 2022.09.29
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 18870번 풀이

BOJ/[BOJ] Python 2022. 9. 30. 00:10

문제

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

입력받은 수직선상의 좌표를 압축한 값을 출력하시오(라는데 이해가 안된다...)

 

Reference

https://eunhee-programming.tistory.com/116

 

코딩테스트 준비 - 백준18870번 좌표압축 풀이:파이썬 딕셔너리 활용 (파이썬)

백준 18870번 풀이 문제풀러가기 https://www.acmicpc.net/problem/18870 Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌" data-og-host="www.acmicpc.net" data-og-source-url="https..

eunhee-programming.tistory.com

https://only-wanna.tistory.com/entry/%EB%B0%B1%EC%A4%80-18870%EB%B2%88-%EC%A2%8C%ED%91%9C-%EC%95%95%EC%B6%95

 

[파이썬] 백준 18870번 좌표 압축

Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌" data-og-host="www.acmicpc.net" data-og-source-url="https://www.acmicpc.net/problem/18870" data-og-url="https://www.acmicpc.ne..

only-wanna.tistory.com

 

풀이

뇌에서 블루스크린이 오긴 했는데... 아무튼... 이게 그래서 뭐 하는 문제냐면요... 엑셀의 rank()함수같은거다... 좌표를 오름차순으로 정렬한 다음 크기가 작은 순서대로 0, 1, 2, 3 이런 식으로 하면 된다. 아무튼 그럼.

 

import sys

N = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
num_list2 = []

일단 나중에 출력하려면 원래 배열을 남겨둬야 한다. 무슨 말인지는 이따 설명해드림. 아무튼 그래서 num_list는 입력받은 리스트고, num_list2는 입력받은 리스트에서 중복값을 쳐내고 오름차순으로 정렬할거다.

 

num_list2 = set(num_list)
num_list2 = sorted(list(num_list2))

그러면 중복값을 쳐내고 정렬하고

 

rank_dic = {num_list2[i]:i for i in range(len(num_list2))}

일단 이거는 리스트 콤프리헨션인데... 중복값을 쳐내고 정렬한다고 했는데, 그러면 예시에 있는 1000 999 1000 999 1000 999의 경우 최종적으로 999, 1000이 된다. 그러면 이 리스트의 0번은 999니까 999(키)-0(밸류)쌍 하나, 1000(키)-1(밸류)쌍 하나 이렇게 나오게 된다. 어? 딕셔너리? 그럼 원 리스트를 남겨둔 건 그것때문이었나요??? 네, 그렇습니다.

 

for i in num_list:
    print(rank_dic[i],end=" ")

딕셔너리는 키로 픽하면 밸류가 나오는 구조이기때문에, 원래 리스트의 요소들을 위에서 만든 딕셔너리로 검색해 밸류를 뽑아내면 된다. 1000 999 1000 999 1000 999면 1000을 키로 픽하고, 999를 픽하고, 이런 식으로 반복하게 된다.

 

import sys

N = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
num_list2 = []
num_list2 = set(num_list)
num_list2 = sorted(list(num_list2))

rank_dic = {num_list2[i]:i for i in range(len(num_list2))}

for i in num_list:
    print(rank_dic[i],end=" ")

아무튼 그렇다. 뇌정지 어유...

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10815번 풀이  (0) 2022.10.12
백준 1620번 풀이  (0) 2022.09.30
백준 10814번 풀이  (0) 2022.09.29
백준 1181번 풀이  (0) 2022.09.29
백준 11650, 11651번 풀이  (0) 2022.09.19
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 10814번 풀이

BOJ/[BOJ] Python 2022. 9. 29. 23:21

문제

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

회원 정보를 나이순으로 정렬하되, 이름 순서는 바뀌지 않도록 하시오.

Reference

https://velog.io/@good159897/%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%AC-VS-%EB%B6%88%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%AC-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%B8%ED%84%B0%EB%B7%B0

 

안정 정렬 VS 불안정 정렬 - [파이썬 알고리즘 인터뷰]

안정 정렬(Stable Sort)란 중복된 값을 입력 순서와 동일하게 정렬합니다.

velog.io

https://blog.naver.com/raylee00/222070980588

 

안정 정렬과 불안정 정렬(Stable sort, Unstable sort)

안정? 불안정? 우리가 프로그래밍을 할 때, 어떤 집합안에 들어있는 원소들을 정렬해야 할 때가 있다. 정렬...

blog.naver.com

https://velog.io/@mquat/python-%EA%B8%B0%EC%B4%88-%EB%B0%B1%EC%A4%80-10814%EC%95%88%EC%A0%95%EC%A0%95%EB%A0%AC%EA%B3%BC-%EB%B6%88%EC%95%88%EC%A0%95%EC%A0%95%EB%A0%AC

 

[python 기초] 백준: 10814번 / 안정정렬과 불안정정렬

 

velog.io

 

풀이

안정 정렬?? 뭔 생전 듣도보도 못 한 정렬이죠? 제가 모르는 알고리즘이 더 있는건가요? 아 그건 아니다. 일단 이거는 배열이 하나일 때를 예시로 들면 애매하니까 두 개의 요소를 갖는 어레이(...)를 예로 들어보자. 예를 들어서 트럼프 카드의 문양과 숫자를 값으로 갖는 배열을 입력했을 때

 

[[스페이드, 2],[하트, 5],[스페이드, 7],[다이아, 5]]

 

이런 배열이 있다 치자. 그리고 카드 숫자를 기준으로 정렬할 때 안정 정렬은

 

[[스페이드,2],[하트,5],[다이아,5],[스페이드,7]]

 

이런 식으로 숫자가 같은 카드의 문양 순서가 변하지 않지만 불안정 정렬의 경우 숫자가 같은 5의 문양 순서가 다이아-하트로 바뀔 수도 있다.

 

import sys

N = int(sys.stdin.readline())
user_list = []

for i in range(N):
    age, name = sys.stdin.readline().split()
    user = (int(age), name)
    user_list.append(user)

배열에 담는 건 맞는데, 나이와 이름을 튜플에 담을거다. 딕셔너리는 키값이 같으면 밸류가 달라도 먼저 들어온 값을 버리기때문에 안된다. 리스트랑 세트는... 안되나? 아무튼...

 

user_list.sort(key=lambda x:x[0])

그 다음은 익명함수 김람다씨 불러야지 뭐. .sort가 안정 정렬을 하기 때문에 이렇게만 하면 된다. 근데 뽑을 때 문제가 하나 있는데... 앞의 문제처럼 for문 줘도 된다. 줘도 되는데 print(i) 하면 튜플이 고대로 나와버린다. 그러면 어떻게 된다? 네 틀립니다.

 

for i in user_list:
    print(i[0],i[1])

그래서 튜플 인덱싱을 해야 한다.

 

import sys

N = int(sys.stdin.readline())
user_list = []

for i in range(N):
    age, name = sys.stdin.readline().split()
    user = (int(age), name)
    user_list.append(user)

user_list.sort(key=lambda x:x[0])

for i in user_list:
    print(i[0],i[1])

그래서 이게 전체 코드다. 

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1620번 풀이  (0) 2022.09.30
백준 18870번 풀이  (0) 2022.09.30
백준 1181번 풀이  (0) 2022.09.29
백준 11650, 11651번 풀이  (0) 2022.09.19
백준 25501번 풀이  (0) 2022.09.13
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 1181번 풀이

BOJ/[BOJ] Python 2022. 9. 29. 22:36

문제

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

주어진 영단어를 주어진 순서대로 정렬하는 문제

 

풀이

자 일단 이 문제를 풀기 위해서는 총 두가지를 해야 한다. 중복되는 단어를 없앤 다음 주어진 순서대로 정렬하는 것. 리스트 출력은 별개로 둡시다...

 

엥? 중복 단어요? 그걸 어떻게 가려내죠? 사람이 일일이 인덱싱 해야 하나요? 에이 그런 노가다 안해도 됨. 파이썬에는 세트(set)라는 매우 좋은 형태가 있다. 세트는 안에 든 것이 중복되면 하나 빼고 다 날려버리기때문에 입력 받은걸 리스트로 저장하고, 그 리스트를 세트로 만든 다음 다시 리스트로 만들면 중복되는 단어들은 깔끔하게 해결된다.

 

import sys

N = int(sys.stdin.readline())
word_list = []

for i in range(N):
    word = sys.stdin.readline().strip()
    word_list.append(word)

word_list = set(word_list)
word_list = list(word_list)
# set으로 중복 날려버리기 신공

그래서 이렇게만 해주면 중복되는 단어들은 아웃! 이제 남은 것은 중복된 단어가 없어진 리스트에서 단어들을 정렬하는 일이다.

 

일단 문제에서 주어진 정렬 기준을 보자. 첫번째로 단어의 길이, 두번째로 ABC순으로 정렬되는데 이게 무슨 소리냐면 i는 한글자고 apple은 다섯글자니까 i가 apple보다 위에 온다는 얘기다. bead와 bean은 둘 다 네글자이므로 bead, bean 순으로 오게 된다. 아니 그럼 이걸 언제 짜죠? 아니 뭘 또 짜요 김람다씨 불러.

 

word_list.sort(key=lambda x:(len(x),x))
# 솔직히 김람다씨 될 줄 몰랐죠...

일단 저기서 순서는 둘째치고... 엥? 괄호로 묶었어요? 람다식으로 정렬할 기준이 여러개면 튜플로 묶으면 된다. 즉, key=lambda x:(len(x),x)에서 (len(x), x)가 정렬 기준 순서. 저렇게 하면 일차적으로 단어의 길이순으로 정렬한 다음 다시 사전 순서대로 정렬하게 된다.

 

import sys

N = int(sys.stdin.readline())
word_list = []

for i in range(N):
    word = sys.stdin.readline().strip()
    word_list.append(word)

word_list = set(word_list)
word_list = list(word_list)
# set으로 중복 날려버리기 신공

word_list.sort(key=lambda x:(len(x),x))
# 솔직히 김람다씨 될 줄 몰랐죠... 

for i in word_list:
    print(i)

근데 나도 이게 한번에 될 줄 몰랐음. 

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 18870번 풀이  (0) 2022.09.30
백준 10814번 풀이  (0) 2022.09.29
백준 11650, 11651번 풀이  (0) 2022.09.19
백준 25501번 풀이  (0) 2022.09.13
백준 1427번 풀이  (0) 2022.08.23
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

Python으로 60갑자 뽑기

Coding/Python 2022. 9. 23. 02:31

참고로 60갑자가 뭔지 궁금하면 달력을 보자. 올해는 임인년이라 인월 인일 인시에 사인검 하나 나온다. (인년 인월 인일 인시 해서 사인이라 사인검이다)


60갑자는 천간 10개와 지지 12개로 이루어지는데... 어? 뭐임? 하나 할인해요? ㄴㄴ 10과 12의 최소공배수가 60임다.

천간: 갑을병정무기경신임계
지지: 자축인묘진사오미신유술해

이렇게 된다. 뒤에 있는 지지가 여러분의 띠이기도 하다. 내가 태어나는 해에도 당연히 갑자가 있고 이게 60년마다 한번씩 돌아오기 때문에 환갑 = 61세(만 60세)에 치른다. 또한 지지가 12개이기때문에 띠동갑은 12살이다.

 

cheongan = ['갑','을','병','정','무','기','경','신','임','계'] * 12
gigi = ['자','축','인','묘','진','사','오','미','신','유','술','해'] * 10
gabja_list = list()

for i in range(len(cheongan)):
  gabja = '{}{}'.format(cheongan[i],gigi[i])
  gabja_list.append(gabja)

print(gabja_list)

천간과 지지가 10개, 12개니까 120으로 잡고 각 배열을 곱했다. 이게 최선임...

['갑자', '을축', '병인', '정묘', '무진', '기사', '경오', '신미', '임신', '계유', '갑술', '을해', '병자', '정축', '무인', '기묘', '경진', '신사', '임오', '계미', '갑신', '을유', '병술', '정해', '무자', '기축', '경인', '신묘', '임진', '계사', '갑오', '을미', '병신', '정유', '무술', '기해', '경자', '신축', '임인', '계묘', '갑진', '을사', '병오', '정미', '무신', '기유', '경술', '신해', '임자', '계축', '갑인', '을묘', '병진', '정사', '무오', '기미', '경신', '신유', '임술', '계해', '갑자', '을축', '병인', '정묘', '무진', '기사', '경오', '신미', '임신', '계유', '갑술', '을해', '병자', '정축', '무인', '기묘', '경진', '신사', '임오', '계미', '갑신', '을유', '병술', '정해', '무자', '기축', '경인', '신묘', '임진', '계사', '갑오', '을미', '병신', '정유', '무술', '기해', '경자', '신축', '임인', '계묘', '갑진', '을사', '병오', '정미', '무신', '기유', '경술', '신해', '임자', '계축', '갑인', '을묘', '병진', '정사', '무오', '기미', '경신', '신유', '임술', '계해']

그러면 이렇게 나온다. 에이 60갑자라면서요?

['갑자', '을축', '병인', '정묘', '무진', '기사', '경오', '신미', '임신', '계유', '갑술', '을해', '병자', '정축', '무인', '기묘', '경진', '신사', '임오', '계미', '갑신', '을유', '병술', '정해', '무자', '기축', '경인', '신묘', '임진', '계사', '갑오', '을미', '병신', '정유', '무술', '기해', '경자', '신축', '임인', '계묘', '갑진', '을사', '병오', '정미', '무신', '기유', '경술', '신해', '임자', '계축', '갑인', '을묘', '병진', '정사', '무오', '기미', '경신', '신유', '임술', '계해'
'갑자', '을축', '병인', '정묘', '무진', '기사', '경오', '신미', '임신', '계유', '갑술', '을해', '병자', '정축', '무인', '기묘', '경진', '신사', '임오', '계미', '갑신', '을유', '병술', '정해', '무자', '기축', '경인', '신묘', '임진', '계사', '갑오', '을미', '병신', '정유', '무술', '기해', '경자', '신축', '임인', '계묘', '갑진', '을사', '병오', '정미', '무신', '기유', '경술', '신해', '임자', '계축', '갑인', '을묘', '병진', '정사', '무오', '기미', '경신', '신유', '임술', '계해']

1+1됐다. 

cheongan = ['갑','을','병','정','무','기','경','신','임','계'] * 12
gigi = ['자','축','인','묘','진','사','오','미','신','유','술','해'] * 10
gabja_list = list()

for i in range(len(cheongan)):
  gabja = '{}{}'.format(cheongan[i],gigi[i])
  gabja_list.append(gabja)

gabja_list = set(gabja_list)
gabja_list = list(gabja_list)
print(gabja_list)

그래서 이렇게 만들고 set->list로 변환하는 과정을 거치면

['신유', '기미', '무신', '병인', '기묘', '신묘', '갑진', '신사', '계사', '을해', '을묘', '경진', '경신', '갑술', '무자', '경자', '임오', '병신', '신축', '기사', '병진', '기해', '임진', '계해', '갑자', '신해', '임자', '경인', '을축', '정사', '계묘', '갑신', '계유', '을사', '갑인', '정유', '무인', '임술', '경오', '을미', '계미', '병술', '임신', '기축', '병자', '임인', '계축', '무오', '을유', '갑오', '경술', '신미', '정미', '정축', '정묘', '무진', '기유', '병오', '정해', '무술']

순서는 개판이지만 길이라 1/2로 줄어드는 기적을 볼 수 있다.

 

cheongan = ['갑','을','병','정','무','기','경','신','임','계'] * 6
gigi = ['자','축','인','묘','진','사','오','미','신','유','술','해'] * 5
gabja_list = list()

for i in range(len(cheongan)):
  gabja = '{}{}'.format(cheongan[i],gigi[i])
  gabja_list.append(gabja)

print(gabja_list)

근데 저렇게 하면 코드도 복잡하고 애초에 반으로 줄여서 하면 그럴 필요가 없잖음? set 만들었다가 하면 순서도 개판이고. 그럼 최소공배수가 60이니까 천간 배열은 6번, 지지 배열은 길이가 12니까 5번 곱하면 되잖음.

['갑자', '을축', '병인', '정묘', '무진', '기사', '경오', '신미', '임신', '계유', '갑술', '을해', '병자', '정축', '무인', '기묘', '경진', '신사', '임오', '계미', '갑신', '을유', '병술', '정해', '무자', '기축', '경인', '신묘', '임진', '계사', '갑오', '을미', '병신', '정유', '무술', '기해', '경자', '신축', '임인', '계묘', '갑진', '을사', '병오', '정미', '무신', '기유', '경술', '신해', '임자', '계축', '갑인', '을묘', '병진', '정사', '무오', '기미', '경신', '신유', '임술', '계해']

깔끔하죠? 

Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 11650, 11651번 풀이

BOJ/[BOJ] Python 2022. 9. 19. 18:03

문제

https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

https://www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

주어진 좌표를 정렬하는 문제. 참고로 두 문제가 정렬 방식이 다른데 11650번은 x좌표 기준, 11651번은 y좌표 기준이다.

 

Reference

https://haesoo9410.tistory.com/193

 

<파이썬> 2차원 배열 정렬

1. 기본적인 리스트 정렬 * sort 정렬  - sort는 리스트에서 제공되는 기본적인 메서드이다. 주로 아래와 같이 사용한다. lst = [2, 3, 5, 6, 1, 4] lst.sort() print(lst) # [1, 2, 3, 4, 5, 6]  - sort 는 기..

haesoo9410.tistory.com

 

풀이

일단 문제의 기본 골자는 XY 좌표를 받아서 요구조건대로 정렬하는 것이다. 그리고 좌표를 어떻게 받을거냐... 2차원 배열로 받을거다.

 

import sys
N = int(sys.stdin.readline())

array = [[list(map(int,sys.stdin.readline().split()))] for j in range (N)]
array.sort()

for x in array:
    for y in x:
        print(y[0],y[1])

11650번은 이렇게만 해도 알아서 정렬된다. 

 

import sys
N = int(sys.stdin.readline())

array = [[list(map(int,sys.stdin.readline().split()))] for j in range (N)]
array.sort(key = lambda x:(x[0][1], x[0][0]))

for x in array:
    for y in x:
        print(y[0],y[1])

11651번은 익명함수 김람다씨를 불러야되는데... y좌표를 기준으로 먼저 오름차순 정렬을 하고 y좌표가 같으면 x좌표 오름차순으로 정렬하는거라 이렇게 하면 된다. 저거 여러개 묶을거면 튜플로 해야된다.

 

근데 하다보니까 자꾸 인덱스 에러나서 봤더니 배열이 ㅋㅋㅋㅋㅋㅋ 삼중이여 ㅋㅋㅋㅋㅋㅋ 원래 이차원 배열이면 [[1,2],[3,4],[1,5]] 이런 식이어야 되는데 저 코드로 만든 배열은 대괄호가 하나 더 있는거라. 그래서 정리했다.

import sys
N = int(sys.stdin.readline())

array = [list(map(int,sys.stdin.readline().split())) for j in range (N)]
array.sort(key = lambda x:(x[1],x[0]))

for x in array:
    print(x[0],x[1])

강제로 고차원행 된 배열에 묵념을 표합시다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10814번 풀이  (0) 2022.09.29
백준 1181번 풀이  (0) 2022.09.29
백준 25501번 풀이  (0) 2022.09.13
백준 1427번 풀이  (0) 2022.08.23
백준 2108번 풀이  (0) 2022.08.23
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

백준 25501번 풀이

BOJ/[BOJ] Python 2022. 9. 13. 15:30

문제

https://www.acmicpc.net/problem/25501

 

25501번: 재귀의 귀재

각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다.

www.acmicpc.net

회문 판독을 재귀함수로 한다. 문제 제목도 회문. 

 

Reference

https://my-coding-notes.tistory.com/580

 

[🥉2 / 백준 25501 / 파이썬] 재귀의 귀재

25501번: 재귀의 귀재 각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다. www.acmicpc.net 문제 정휘는 후배들이 재귀 함수를 잘 다루

my-coding-notes.tistory.com

 

풀이

일단 회문은 거꾸로 해도 같은 게 회문이다. 스위스 기러기 토마토 이런것도 회문이고, 여보 안경 안보여도 회문. 띄어쓰기 빼고 보면 회문 맞다. 근데... 이거... 거꾸로 뒤집은거랑 같으면 회문 콜 하면 되는거 아니었냐... 왜 재귀맛이...

 

참고로 제한효소 시퀀스도 회문이다. 예? 왜죠? 


5'-GAATTC-3'
3'-CTTAAG-5'


각각 5'에서 3' 방향으로 읽어보자.

 

참고로 이번 문제는 떠먹여주는 힌트가 있는데, 그걸 고대로 내면 안 되고 두 가지 요소를 추가해야 한다. 첫번째가 몇 번 호출했나이고 두번째가 입력 반복문으로 받는거다.

 

def recursion(s, l, r):
    if l >= r: return 1
    elif s[l] != s[r]: return 0
    else: return recursion(s, l+1, r-1)

def isPalindrome(s):
    return recursion(s, 0, len(s)-1)

print('ABBA:', isPalindrome('ABBA'))
print('ABC:', isPalindrome('ABC'))

이게 그 떠먹여주는 코드. 

 

일단 저 두 함수가 뭐 하는거냐... 아래 함수는 입력받아서 인자로 넘겨주는 함수고 위 함수는 인자로 넘겨받은 문자가 회문인지 판독해준다. 근데 문자열 하나 받는데 인자가 3개가 넘어간다? 맨 오른쪽건 문자열 길이-1이다. 어? 인덱싱??? 그렇다.

 


예시에 나온 ABBA를 예로 들어보면 ABBA, 0, 3이 넘어가게 되는데

1) ABBA, 0, 3 -> 0번째랑 3번재가 같네? -> 0 < 3이므로 크거나 같지 않음 -> ABBA, 1, 2
2) ABBA, 1, 2 -> 1번째랑 2번째가 같네? -> 1 < 2이므로 크거나 같지 않음 -> ABBA, 2, 1
3) ABBA, 2, 1 -> 2 > 1이므로 리턴 1

이렇게 된다. (홀수일때는 0,4->1,3->2로 같아지기때문에 끝)

 

for i in range(T):
    S = sys.stdin.readline().strip()
    print(isPalindrome(S))

입력 여러개 받는 건 그냥 이렇게만 해도 된다. 단, sys.stdin.readline()으로 받을때는 공백을 반드시 떼주자. 

 

import sys 
T = int(sys.stdin.readline())

def recursion(s, l, r):
    global count
    count += 1

    if l >= r: 
        return 1
    elif s[l] != s[r]: 
        return 0
    else: 
        return recursion(s, l+1, r-1)

def isPalindrome(s):
    return recursion(s, 0, len(s)-1)

for i in range(T):
    count = 0
    S = sys.stdin.readline().strip()
    print(isPalindrome(S), count)

횟수 세 주는건 유서깊은 count인데... 이제 문제가 있다. 저걸 함수 안에서 선언하고 더하면 괴랄하게 된다. 그리고 for문에서 선언해버리면 함수 입장에서 count는 없는 변수가 돼서 미쳤습니까 휴먼? 한다. 그래서 global로 전역 번수 선언을 해 줘야 한다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 1181번 풀이  (0) 2022.09.29
백준 11650, 11651번 풀이  (0) 2022.09.19
백준 1427번 풀이  (0) 2022.08.23
백준 2108번 풀이  (0) 2022.08.23
백준 25305번 풀이  (0) 2022.08.23
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

RE with FLASK-유효성 검사

Coding/Python 2022. 8. 24. 13:15

예전에 익스트림 CRUD에 나왔던 그거 맞다. 대신 익스트림 CRUD에 비해 입력받는 항목도 적고, 형식검사도 한 가지 부분에 대해서만 진행하면 되기때문에 코드가 비교적 간소하다.

 


입력인자 중 공백 여부를 체크할 것은

1. 시퀀스
2. 시퀀스 이름
3. 시퀀스 정보

이고, 형식을 체크할 것은 시퀀스 하나뿐이다. DNA는 다들 아시다시피 A, T, G, C로 구성되어 있고 DNA 시퀀스에도 당연히 A, T, G, C만 들어간다. 대소문자 입력을 감안해도 atgcATGC 이렇게 여덟개다.

 

어? 제한효소 인식 시퀀스에는 W나 N같은 것도 있잖아요! 그건 DNA 시퀀스가 문제가 아니라 그 제한효소가 인식하는 염기가 두 개 이상이라는 소리다. 예를 들어서 GGWCC라는 인식 시퀀스를 가지는 제한효소가 있다면, 이 효소는 GGACC나 GGTCC 둘 다 인식한다는 소리이다. 그래서 Cutter와 Finder에서도 효소의 인식 시퀀스에 있는 A, T, G, C 외의 알파벳은 해당 알파벳이 지정하는 염기에 맞게 정규식 처리를 한 다음 돌린다. GG[AT]CC 이런 식으로.


function cutFilter() {
    const checked_input = document.querySelectorAll('#cutter_select');
    const textarea = document.querySelectorAll('textarea');
    const checked_fasta = document.querySelectorAll('#FASTA');
    const checked_gen = document.querySelectorAll('#Genbank');
    const NEB_filter = document.getElementsByName('option_NEB');
    const cut_filter = document.getElementsByName('option_cut');
    const sequence_name = document.getElementById('sequence-name').value;
    const sequence_desc = document.getElementById('sequence-desc').value;
    const sequence_valid = RegExp(/[^atgcATGC]/g)
    let sequence = '';

    if (checked_input[0].checked == true) {
        sequence = textarea[0].value;
        if (sequence_valid.test(sequence)) {
            alert('시퀀스 형식이 올바르지 않습니다! ')
        }
    }
    for (let i = 0; i < NEB_filter.length; i++) {
        if (NEB_filter[i].checked == true) {
            NEB_filter_val = NEB_filter[i].value;
        }
    }
    for (let i = 0; i < cut_filter.length; i++) {
        if (cut_filter[i].checked == true) {
            cut_filter_val = cut_filter[i].value
        }
    }

    if (sequence_name.length == 0 || sequence_desc.length == 0 || sequence.length == 0) {
        alert('빈 칸을 채워주세요!')
    }
    if (sequence_name.length != 0 && sequence_desc.length != 0 && sequence.length != 0 && !sequence_valid.test(sequence)) {
        $.ajax({
            type: "POST",
            url: "/cutter",
            data: {
                NEB_give: NEB_filter_val,
                cut_give: cut_filter_val,
                sequence_give: sequence,
                sequence_name_give: sequence_name,
                sequence_desc_give: sequence_desc
            },
            success: function (response) {
                let head_msg = response['head_give']
                let result_msg = response['result_give']
                let end_message = response['end_give']
                let result = document.getElementById('cut_result');
                result.innerHTML = head_msg;
                for (let i = 0; i < result_msg.length; i++) {
                    result.innerHTML = result.innerHTML.concat("\n", result_msg[i])
                }
                result.innerHTML = result.innerHTML.concat("\n", end_message)
            }
        })
    }
}

Cutter의 경우 라디오버튼이 있어서 코드가 좀 더 길다.

 

function findFilter() {
    const input_enz = document.getElementById('enzyme').value;
    const textarea = document.querySelectorAll('textarea');
    const checked_fasta = document.querySelectorAll('#FASTA');
    const checked_gen = document.querySelectorAll('#Genbank');
    const sequence_name = document.getElementById('sequence-name-finder').value;
    const sequence_desc = document.getElementById('sequence-desc-finder').value;
    const sequence_valid = RegExp(/[^atgcATGC]/g)
    let sequence = textarea[2].value
    if (sequence_valid.test(sequence)) {
        alert('시퀀스 형식이 올바르지 않습니다! ')
    }

    if (sequence_name.length == 0 || sequence_desc.length == 0 || sequence.length == 0) {
        alert('빈 칸을 채워주세요!')
    }

    if (sequence_name.length != 0 && sequence_desc.length != 0 && sequence.length != 0 && !sequence_valid.test(sequence)) {
        $.ajax({
            type: "POST",
            url: "/finder",
            data: {
                sequence_give: sequence,
                enzyme_give: input_enz,
                sequence_name_give: sequence_name,
                sequence_desc_give: sequence_desc
            },
            success: function (response) {
                let msg = response['head_give']
                let result = document.getElementById('find_result');
                result.innerHTML = msg;
            }
        })
    }
}

Finder는 라디오버튼이 없기때문에 비교적 코드가 짧다.

 

공란이 있을 때
시퀀스 형식 불일치(소문자는 어차피 서버단에서 대문자로 바꾼다)

'Coding > Python' 카테고리의 다른 글

강해져서 돌아온 ChatGPT에게 코딩을 시켜보자  (0) 2023.03.20
Python으로 60갑자 뽑기  (0) 2022.09.23
RE with FLASK-시퀀스 정보  (0) 2022.08.23
RE with FLASK-Cutter/Finder  (0) 2022.08.22
RE with FLASK-Searcher 이식하기  (0) 2022.08.22
Lv. 35 라이츄

Lv. 35 라이츄

광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ

방명록