본문 바로가기

STUDY

파이썬 스터디 9주차

ㅋㅋㅋ 8주차 어디갔냐고 물어보시면 저도 몰라요...

백년만에 문제 푸는 것 같아서 쉬운 것부터 풀겠습니다!


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

 

2920번: 음계

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8

www.acmicpc.net

import sys

scale = list(map(int, sys.stdin.readline().split()))
if scale == list(range(1,9)):
  print("ascending")
elif scale == list(range(1,9))[::-1]:
  print("descending")
else:
  print("mixed")

첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다. 1부터 8까지 차례대로 나온다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed를 출력해라.

> 쉬운 문제인데도 list(map(int~.split()))이나 range로만 쓰는게 아닌 list(range)등이 헷갈려 10~20분은 족히 쓴 것 같다. 역시 이래서 문제를 계속 풀어야 하나보다ㅠ 

> reverse메소드는 반환값이 없어 reversed한 것을 출력하면 none이 나온다. 따라서 iteration을 하려면 reversed(iterate대상)으로 쓴다. 아니면 리스트명[::-1]을 사용. 참고로 수행 시간은 리스트[::-1]이 더 짧다.

 

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

 

2475번: 검증수

컴퓨터를 제조하는 회사인 KOI 전자에서는 제조하는 컴퓨터마다 6자리의 고유번호를 매긴다. 고유번호의 처음 5자리에는 00000부터 99999까지의 수 중 하나가 주어지며 6번째 자리에는 검증수가 들

www.acmicpc.net

import sys

nums = list(map(int, sys.stdin.readline().split()))
temp = 0
for i in nums:
    temp = temp+i**2
    
print(temp%10)

검증수는 고유번호의 처음 5자리에 들어가는 5개의 숫자를 각각 제곱한 수의 합을 10으로 나눈 나머지이다. 첫째 줄에 고유번호의 처음 5자리의 숫자들이 빈칸을 사이에 두고 하나씩 주어진다. 검증수를 출력하라.

 

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

 

2908번: 상수

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두

www.acmicpc.net

import sys

a, b = str, sys.stdin.readline().split()
if str(a)[::-1] > str(b)[::-1]:
  print(str(a)[::-1])
else:
  print(str(b)[::-1])

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다. 상수의 대답을 출력하라.

> 문자열도 [::-1]로 뒤집을 수 있나? 싶어서 해봤는데 되길래 활용해봤다. 하지만 더 짧게 혹은 더 간단하게 짤 수 있었을 것 같아 아쉽다. 

 

 

쨘! 위 문제들을 풀었던 이유. ㅎㅎㅎ 뿌듯하다


그럼 이제 원래라면 파이썬 스터디 6주차 백준 내용인 '정렬' 풀어보겠씀니다!!

 

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

import sys

n = int(sys.stdin.readline())
coordinates = []
for i in range(n):
  x, y = map(int, sys.stdin.readline().split())
  coordinates.append([y, x])

for y, x in sorted(coordinates):
  print(x, y)​

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

> 생각한 방식이 있는데 계속 그대로 안 되길래 결국 구글링 했다. 그리고 코드를 보자 마자 왜 안됐는지 바로 앎..

> 리스트 안의 리스트로 풀어야겠단 것 까진 생각했는데 (아예 a = list(map~)으로 받아 그 리스트를 넣어줬음) 이것 때문인지 sort(key=~)를 쓰기도 애매하다 생각했다. 따로 받았다가 리스트 형식으로 append해주고 출력할때는 또 다르게 출력한다는 게 새삼 신기...

> 다음에 한번 더 풀어야겠다

> 도움받은 블로그 : https://wook-2124.tistory.com/473

 

백준 알고리즘 | 11651 : 좌표 정렬하기 2 (Python / 파이썬)

좌표 정렬하기 2 성공분류 시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율 1 초 256 MB 17496 11727 9965 69.356% https://www.acmicpc.net/problem/11651 11651번: 좌표 정렬하기 2 첫째 줄에 점의 개수..

wook-2124.tistory.com

 

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

import sys

n = int(sys.stdin.readline())
coordinates = []
for i in range(n):
  x, y = map(int, sys.stdin.readline().split())
  coordinates.append([x, y])

for x, y in sorted(coordinates):
  print(x, y)

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

> 11651보다 쉬운데(따로 x,y를 설정해주지 않고 그냥 sort를 해도 풀릴 것 같은데..?) 정답비율이 낮은 이유가 "제출한 사람의 수가 11651에 비해 많기 때문" 인 것 같다. 이거야 말로 통계의 오류가 아닐까 ㅋㅎ...

for i in range(n):
  nums = list(map(int, sys.stdin.readline().split()))
  coordinates.append(nums)
  
for i in sorted(coordinates):
  print(i[0], i[1])
 
 
 
> 11651에서 말한, 내가 원래 푸려던 방법이다. 11651은 y좌표 기준 정렬이라 바로 리스트에 넣어주면 sort 과정이 복잡해지나 이 문제는 아니다. 두개의 for문을 이렇게 바꿔도 된다 :3

 

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

 

1181번: 단어 정렬

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

www.acmicpc.net

import sys

n = int(sys.stdin.readline())
sent = []
for i in range(n):
  temp = sys.stdin.readline().strip()
  if temp not in sent:
    sent.append(temp)

sent = sorted(sent) #우선 사전 순으로 정렬
sent.sort(key=len) #그리고 길이 순으로 정렬

for i in sent:
  print(i)

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

> 중복값을 제거하는 방법으로는1)list(set(리스트명))랑 2)for문으로 같은 게 있다면 추가하지 않는 방법이 있다.

> 공식문서에는 sort(key=str.lower)만 있고 문자열 길이에 대한 건 없더라. 더 찾아보니 key=len으로 하면 되는 것 같다!

> sorted와 sort의 순서를 바꾸면 출력이 이상해진다

> 참고 : https://www.delftstack.com/ko/howto/python/sort-list-alphabetically/

 

Python에서 알파벳순으로 목록 정렬

이 튜토리얼은 Python에서 알파벳순으로 목록을 정렬하는 방법을 보여줍니다.

www.delftstack.com