본문 바로가기
스터디/Python

[CodingTest][2022-12-29~2023-01-01]프로그래머스 코딩테스트 Lv.0 문제들

by SeO.V 2023. 1. 4.

프로그래머스 코딩테스트 Lv.0 문제들

2022-12-29 ~ 2023-01-01 까지 대략 4일치 총 12문제

푼 문제 : 등수 매기기, 특이한 정렬, 유한소수 판별하기, 겹치는 선분의 길이, 평행, 저주의 숫자 3, 외계어 사전, 삼각형의 완성조건 (2), 안전지대, 숨어있는 숫자의 덧셈 (2), 다항식 더하기, 최댓값 만들기 (2)

사실상 푼 날짜는 몰아서 풀어서..ㅠㅠ

 

등수 매기기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120882

 

문제 설명

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 0 ≤ score[0], score[1] ≤ 100
  • 1 ≤ score의 길이 ≤ 10
  • score의 원소 길이는 2입니다.
  • score는 중복된 원소를 갖지 않습니다.

입출력 예

score  result
[[80, 70], [90, 50], [40, 70], [50, 80]] [1, 2, 4, 3]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] [4, 4, 6, 2, 2, 1, 7]

 

코드 제출 :

# 첫번째 실행 성공 - 테스트 3,6 실패
def solution(score):
    score = [int(sum(mean)/len(mean)) for mean in score]
    sorted_tmp = sorted(score,reverse=True)
    return [sorted_tmp.index(rank)+1 for rank in score]
# 제출 - 성공
def solution(score):
    score = [(sum(mean)/len(mean)) for mean in score]
    sorted_tmp = sorted(score,reverse=True)
    return [sorted_tmp.index(rank)+1 for rank in score]

해설

더보기

처음에 실행은 잘 되는데 테스트케이스 안되서 질문하기로 보니까 int로 받게 되면 실제 평균이 정수로 딱 떨어지지 않는 케이스가 있어서 그렇다고 한다. 그래서 int제외하니까 잘 됨.

푼 건 score로는 어차피 들어온 값이고 실제로 필요한 건 평균 mean을 가지고 순서rank를 매기는 셈이라서, score에 평균값들을 덮어씌우고 거기서 순서를 매기기 위해서 역순으로 sorted한 걸 잡고 거기서 다시 반환할 때 score에서 역순의 index로 list를 잡아서 해결.

 

점수 : 1225(+6)


특이한 정렬

link : https://school.programmers.co.kr/learn/courses/30/lessons/120880

 

문제 설명

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 원소 ≤ 10,000
  • 1 ≤ numlist의 길이 ≤ 100
  • numlist는 중복된 원소를 갖지 않습니다.

입출력 예

numlist  result
[1, 2, 3, 4, 5, 6] 4 [4, 5, 3, 6, 2, 1]
[10000,20,36,47,40,6,10,7000] 30 [36, 40, 20, 47, 10, 6, 7000, 10000]

 

 

코드 제출 :

def solution(numlist, n):
    return sorted(numlist, key=lambda num : (abs(num-n), -num))

 

해설

더보기

ref : https://docs.python.org/3/howto/sorting.html#sortinghowto

 

예전에 백준 할 때 sorted에 lambda 조건으로 key를 주고 여러 개의 조건이면 tuple로 묶어서 한 기억으로 했는데 첫번째 조건은 차에 절대값이 큰 순으로 넣고, 두 번째로 그 값이 동일할 경우, 큰 거는 역순인 셈이라서 -를 붙여서 하고(인덱스 기준이라 해서.) 처리.

점수 : 1229(+4)


유한소수 판별하기 

link : https://school.programmers.co.kr/learn/courses/30/lessons/120878

 

문제 설명

소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.

  • 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.

두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • a, b는 정수
  • 0 < a ≤ 1,000
  • 0 < b ≤ 1,000

입출력 예

result
7 20 1
11 22 1
12 21 2

 

 

코드 제출 :

# 제출
from math import gcd
def solution(a, b):
    gcd_ = gcd(a,b)
    a = int(a/gcd_)
    b = int(b/gcd_)
    while (b/2).is_integer():
        b //= 2
    while (b/5).is_integer():
        b //= 5
    return 1 if (a/b).is_integer() else 2

소수 개념

더보기
  • 소수(素數, 문화어: 씨수, 영어: prime number)는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수다. 예를 들어, 5는 1×5 또는 5×1로 수를 곱한 결과를 적는 유일한 방법이 그 수 자신을 포함하기 때문에 5는 소수이다. 그러나 6은 자신보다 작은 두 숫자의 곱(2×3)이므로 소수가 아닌데, 이렇듯 1보다 큰 자연수 중 소수가 아닌 것은 합성수라고 한다. 1과 그 수 자신 이외의 자연수로는 나눌 수 없는 자연수로 정의하기도 한다.
  • ref : https://ko.wikipedia.org/wiki/소수_(수론)
  • 소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수 라고 했다.

유한소수 개념

더보기
  • 유한소수 는 유리수의 일종이다.
  • 유리수 $\ne$ 분수다.
  • 유한소수
    ex) 0.75, 1/4 == 0.25 등 한계가 유한해서 깔끔하게 나뉨.
  • 무한소수
    : 소수점 아래에 0이 아닌 숫자가 무한히 계속되는 소수

유한소수와 무한소수 구별법

  1. 분수의 분자와 분모를 약분해서 기약분수로 만든다.
  2. 분모를 소인수분해한다. 분자는 할 필요 없다. 분모의 소인수가 2나 5뿐이라면 이 분수는 유한소수, 2나 5 외에 다른 소인수가 있다면 이 분수는 무한소수라고 한다.
  • ex) 1/3 == 0.33333333…..
  • 무한소수
  • : 소수점 아래에 0이 아닌 숫자가 유한개인 소수. 유한은 한계가 있다는 뜻으로 소수점 아래의 숫자들이 끝나는 지점이 있다는 것이 특징이다.
  • 유리수는 유한소수무한소수로 나눌 수 있다.
  • 유리수는 분수꼴로 나타낼 수 있는 수 를 유리수라 한다. 수의 모양을 분수꼴로 바꿀 수 있으면 다 유리수라고 할 수 있지만 유리수와 분수는 다르다.
source : https://mathbang.net/220

 

해설

더보기

사실 유한소수 개념은 이해했는데 문제를 그대로 하려고 하다가 안되서 다른 사람들 풀이 참조함. 

- 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다. 위의 문구로 기약분수 만들려고 GCD를 이용해서 나눈 다음에 2와 5가 존재 안 하도록 나눴으니 소인수가 2와 5를 제외하고 있을 경우로 하되, 분자와 나눴을 때 정수가 되면 유리수가 아닌 셈이므로 유한소수도 아닌 것임. 그 부분을 이용.

 

점수 : 1239(+10)

 


겹치는 선분의 길이

link : https://school.programmers.co.kr/learn/courses/30/lessons/120876

 

문제 설명

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

 

제한사항

  • lines의 길이 = 3
  • lines의 원소의 길이 = 2
  • 모든 선분은 길이가 1 이상입니다.
  • lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.
    • 100 ≤ a < b ≤ 100

입출력 예

lines  result
[[0, 1], [2, 5], [3, 9]] 2
[[-1, 1], [1, 3], [3, 9]] 0
[[0, 5], [3, 9], [1, 10]] 8

 

 

코드 제출 :

# 첫번째 실패
def solution(lines):
    tmp = [range(num[0],num[1]+1) for num in lines]
    answer = 0
    for num in lines:
        tmp += list(range(num[0],num[1]+1))
    print(tmp)
    for n in range(min(tmp), max(tmp)):
        if tmp.count(n) > 1:
            answer += 1
    return answer - 1 if answer > 2 else 0
# 두번째 실패
def solution(lines):
    total = [set(range(num[0],num[1]+1)) for num in sorted(lines)]
    union = (total[0]&total[1])|(total[1]&total[2])|(total[0]&total[2])
    return len((total[0]&total[1])|(total[1]&total[2])|(total[0]&total[2]))-1 if sorted(union)[1]-sorted(union)[0] == 1 else 0
# 제출
def solution(lines):
    total = [set(range(num[0],num[1])) for num in sorted(lines)]
    inter1 = total[0].intersection(total[1])
    inter2 = total[1].intersection(total[2])
    inter3 = total[0].intersection(total[2])
    union = (inter1|inter2|inter3)
    return len(union)

lines = [[0, 5], [3, 9], [1, 10]]
solution(lines)

 

해설

더보기

처음에는 문제를 range 개념으로 인지한 다음에 들어간 범위를 전부 set처럼 하나로 모은 다음에 count를 생각하긴 했는데 저 이상에서 발전시킬 방법이 이해가 안 가서 접근 방법을 바꿈.

겹친다는 건 동일한 요소가 있다는 뜻이고 range 로 나온 수들은 중복이 없으니 set으로 전환한 다음의 set의 연산을 이용하여 교집합(어차피 line의 크기는 3뿐이라)을 잡고 그 안에서 합집합의 길이를 구함.

 

점수 : 1249(+10)

 


평행

link : https://school.programmers.co.kr/learn/courses/30/lessons/120875

 

문제 설명

점 네 개의 좌표를 담은 이차원 배열  dots가 다음과 같이 매개변수로 주어집니다.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 0 ≤ dots의 원소 ≤ 100
  • dots의 길이 = 4
  • dots의 원소의 길이 = 2
  • dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
  • 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
  • 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
  • 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.

입출력 예

dots  result
[[1, 4], [9, 2], [3, 8], [11, 6]] 1
[[3, 5], [4, 1], [2, 4], [5, 10]] 0

 

 

코드 제출 :

# 제출
from itertools import combinations
def solution(dots):
    lines = list(combinations(dots,2))
    gradients = []
    for two in lines:
        x1 = two[0][0]
        y1 = two[0][1]
        x2 = two[1][0]
        y2 = two[1][1]
        grade = (y2-y1)/(x2-x1)
        gradients.append(grade)
    for i in range(len(gradients)):
        if gradients.count(gradients[i]) > 1:
            return 1
    return 0

 

해설

더보기

평행 이라 함은 겹치든 안 겹치든 기울기가 같다는 의미인가? 라는 걸로 시작해서 기울기를 구하는 공식은 두 점 (x1, y1)과(x2,y2)가 있을 때 (y_2 - y_1)/(x_2 - x_1) = a 로서 a가 기울기가 됨.

그 부분을 이용해서 어차피 dots는 4개만 주어지므로 각자 dots 의 경우의 수를 combinations로 구한 다음에 x1, y1,x2,y2를 각자 잡고 기울기를 구해서 그 기울기가 동일한 것이 있다 == count시에 2 이상이다 하면 1을 return 함.

 

점수 : 1258(+9)

 


저주의 숫자 3

link : https://school.programmers.co.kr/learn/courses/30/lessons/120871

 

문제 설명

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

10진법 3x 마을에서 쓰는 숫자 10진법 3x 마을에서 쓰는 숫자

1 1 6 8
2 2 7 10
3 4 8 11
4 5 9 14
5 7 10 16

정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 100

입출력 예

result
15 25
40 76

 

 

코드 제출 :

# 제출
def solution(n):
    return sorted(i for i in range(1,10001) if i % 3 != 0 and str(i).find('3') == -1)[n-1]

 

해설

더보기

sorted로 정렬을 기본으로 한 다음에, for 문으로 숫자를 sequence로 만들고,

조건을 문제 그대로 3의 배수 아닐 것 if i % 3 != 0 과 if str(i).find('3') == -1 3이 들어가지 않을 것을 기본으로 해서 처리.

처음에 range를 100으로 했더니 런타임 에러나서 질문하기에 보니까 100이상의 수도 있다고 해서 그냥 10001로 추가해버림.

 

점수 : 1260(+2)

 


외계어 사전

link : https://school.programmers.co.kr/learn/courses/30/lessons/120869

 

문제 설명

PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • spell과 dic의 원소는 알파벳 소문자로만 이루어져있습니다.
  • 2 ≤ spell의 크기 ≤ 10
  • spell의 원소의 길이는 1입니다.
  • 1 ≤ dic의 크기 ≤ 10
  • 1 ≤ dic의 원소의 길이 ≤ 10
  • spell의 원소를 모두 사용해 단어를 만들어야 합니다.
  • spell의 원소를 모두 사용해 만들 수 있는 단어는 dic에 두 개 이상 존재하지 않습니다.
  • dic과 spell 모두 중복된 원소를 갖지 않습니다.

입출력 예

spell  dic  result
["p", "o", "s"] ["sod", "eocd", "qixm", "adio", "soo"] 2
["z", "d", "x"] ["def", "dww", "dzx", "loveaw"] 1
["s", "o", "m", "d"] ["moos", "dzx", "smm", "sunmmo", "som"] 2

 

 

코드 제출 :

# 제출
def solution(spell, dic):
    spell = set(spell)
    for txt in dic:
        if spell.issubset(txt):
            return 1
    return 2

 

해설

더보기

ref : https://docs.python.org/3/library/stdtypes.html#frozenset.issubset

처음엔 문자열의 조합으로 combinations 생각했다가 너무 for문의 중복이어서 버리고 조합이라는 부분으로 보다가 set이 생각나서 찾아보니까 부분집합인지 아닌지 확인해주는 메서드 확인

기본적으로 set(A).issubset(B) 로서, A가 B의 부분집합인지를 test하고 모든 요소가 있으면 True이다.

  • issubset(other)set <= other : Test whether every element in the set is in other.
  • set < otherTest whether the set is a proper subset of other, that is, set <= other and set != other.

 

점수 : 1262(+2)

 


삼각형의 완성조건 (2)

 

link : https://school.programmers.co.kr/learn/courses/30/lessons/120868

 

문제 설명

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 2입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

입출력 예

sides  result
[1, 2] 1
[3, 6] 5
[11, 7] 13

 

 

코드 제출 :

# 제출
def solution(sides):
    long = range(max(sides)+1,min(sides)+max(sides))
    short = range(max(sides)-min(sides)+1,max(sides)+1)
    return len(long)+len(short)

 

해설

더보기

문제 그대로 보다가 “가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.” 라는 부분과 각 경우의 수로서 sides이면서 의 수로서 다른 두 변의 합 혹은 가장 큰 길이를 max로 잡고 해서 len의 합으로 처리했으나,

다른 사람 풀이 중에서 깔끔했던 거 sum(sides) - max(sides) + min(sides) - 1 이 부분 감탄..

 

점수 : 1263(+1)

 


안전지대

link : https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열

board

에 1로 표시되어 있고

board

에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.

지뢰가 매설된 지역의 지도

board

가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

입출력 예

board  result
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] 16
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] 13
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] 0

 

 

코드 제출 :

# 제출
def solution(board):
    size = len(board)
    total = size**2
    danger = list()
    for i in range(size):
        if board[i].count(1) > 0:
            for m in range(size):
                if board[i][m] == 1:
                    danger += [(-1+i,-1+m),(0+i,-1+m),(+1+i,-1+m),(-1+i,0+m),(0+i,0+m),(+1+i,0+m),(-1+i,1+m),(0+i,1+m),(1+i,1+m)]
    danger = [(x,y) for x,y in danger if (x >= 0 and x <=size-1) and (y >= 0 and y <= size-1)]
    return total - len(set(danger)) if total - len(set(danger)) > 0 else 0

 

해설

더보기

이전에 이코테의 맵과 비슷한 느낌이었는데 여기는 지뢰와 위험군의 갯수만 세는 것이라서

  1. 이중 for 문으로 가로와 세로 모두 loop를 하되, 1이라는 지뢰가 있을 때만 해당 for 문을 돌도록 하고
  2. 지뢰의 위치가 1이면 위험군의 가능성을 x와 y 좌표에 맞게 설정을 하고 전부 넣은 다음에,
  3. if 문으로 board의 범위를 벗어나지 않도록 하면 board에는 지뢰와 위험지대의 좌표 정보를 모두 포함하며 set이기 때문에 중복이 없어진다. 그러므로 붙어있는 지뢰의 위치의 중복 위험지대도 해결. 이 갯수를 total이라는 칸의 갯수에서 빼되, 음수면 0으로 처리.

 

점수 : 1270(+7)

 


숨어있는 숫자의 덧셈 (2)

link : https://school.programmers.co.kr/learn/courses/30/lessons/120864

 

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

입출력 예

my_string  result
"aAb1B2cC34oOp" 37
"1a2b3c4d123Z" 133

 

 

코드 제출 :

# 제출
import re
def solution(my_string):
    return sum(map(int,(''.join(re.sub(r'[^0-9]', ' ', my_string))).split()))

 

해설

더보기

당연하게 정규식으로 가져오고, re.sub로 숫자가 아닌 경우의 조건 [^0-9] 을 띄어쓰기로 바꿔서 숫자가 이어진 경우 덩어리가 되도록 한 다음에 그걸 join으로 하고 다시 map으로 int처리 및 분리를 한 다음에 sum으로 결합했는데

# 다른 사람 풀이
def solution(my_string):
    s = ''.join(i if i.isdigit() else ' ' for i in my_string)
    return sum(int(i) for i in s.split())

정규식 없이 하는 방법으로는 이쪽이 좀 더 빠르게 될 거 같다.

 

점수 : 1275(+5)

 


다항식 더하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120863

 

문제 설명

한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.

 

제한사항

  • 0 < polynomial에 있는 수 < 100
  • polynomial에 변수는 'x'만 존재합니다.
  • polynomial은 0부터 9까지의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
  • 항과 연산기호 사이에는 항상 공백이 존재합니다.
  • 공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
  • 하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
  • " + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
  • "012x + 001"처럼 0을 제외하고는 0으로 시작하는 수는 없습니다.
  • 문자와 숫자 사이의 곱하기는 생략합니다.
  • polynomial에는 일차 항과 상수항만 존재합니다.
  • 계수 1은 생략합니다.
  • 결괏값에 상수항은 마지막에 둡니다.
  • 0 < polynomial의 길이 < 50

입출력 예

polynomial  result
"3x + 7 + x" "4x + 7"
"x + x + x" "3x"

 

 

코드 제출 :

# 제출
def solution(polynomial):
    elements = [x for x in polynomial.split() if x != '+']
    if len(elements) == 1:
        return ''.join(elements)
    num = sum([int(n) for n in elements if n.isdigit()])
    variable = sum(int('1') if e == 'x' else int(e[:-1]) for e in elements if 'x' in e)
    return f'{variable if variable >= 2 else ""}{"x" if variable > 0 else ""}{" + " if variable*num else ""}{num if num > 0 else ""}'

 

해설

더보기

처음에는 element로 분리하고 num과 x의 수인 variable은 했는데

return 하는 부분에서 테스트 케이스에서 많이 착오가 있었다.

  1. x + 0
  2. x + x
  3. 3 + 5
  4. 1x

기억나는 것만 이런 건데.. 하나씩 하다보니까 “ + ”를 넣는 조건이 길어질수록 머리도 아프고 코드도 길고 시간도 길어져서 찾아보다가 결국 앞 뒤 둘 중 하나만이라도 0이 있다면 “ + ”를 빼야한다는 결론에 도달했고,

파이썬의 기본중인 if else 로 했을 때, True if 0 else False 의 결과는 False다. 0 == False 라는 Boolean 값에 따라서, 이걸 이용해서 둘 중 하나라도 0이 있다면 0을 곱하면 0이므로!

드디어 해서 해결함.

 

점수 : 1285(+10)

 


최댓값 만들기 (2)

link : https://school.programmers.co.kr/learn/courses/30/lessons/120862

 

문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 10,000 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers 의 길이 ≤ 100

입출력 예

numbers  result
[1, 2, -3, 4, -5] 15
[0, -31, 24, 10, 1, 9] 240
[10, 20, 30, 5, 5, 20, 5] 600

 

 

코드 제출 :

# 제출
from itertools import combinations
def solution(numbers):
    comb = sorted(combinations(numbers,2))
    minus = min(comb)
    plus = max(comb)
    return max(minus[0]*minus[1],plus[0]*plus[1])

 

해설

더보기

조합의 곱이라고 먼저 생각해버려서 combinations 를 쓰고 가장 작은 조합과 가장 큰 조합끼리 곱 중 max로 해서 맞긴 맞았는데, 다른 사람들 풀이 중에서

# 다른 사람의 풀이
def solution(numbers):
    numbers = sorted(numbers)
    return max(numbers[0] * numbers[1], numbers[-1]*numbers[-2])

이거 보니까 그냥 숫자 sorted 하고 가장 작은 2개랑 가장 큰 2개랑 곱해서 max할 걸 하는 생각을 뒤늦게 함..ㅠㅠ

 

점수 : 1288(+3)

 


여기까지 12문제 우선은.