Programming/코딩테스트

연습 문제: 삼총사 / 스택,큐: 같은 숫자는 싫어

알파고라니 2023. 4. 17. 15:51

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

 

프로그래머스

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

programmers.co.kr

https://school.programmers.co.kr/learn/courses/30/lessons/131705?language=python3 

 

프로그래머스

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

programmers.co.kr

프로그래머스의 코딩 테스트 연습 문제 중 두 문제를 가져와서 풀어보았다.

언어는 파이썬이다.

 

문제1

문제설명:

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

 

배열을 입력받아 중복된 값을 순서를 유지한 채로 없애는 문제이다.

단순하게 첫 번째 인덱스 값을 미리 정답리스트에 넣은 후,

for 반복문 처리를 통해 이전 인덱스 값과 다르면 .append()하는 로직을 사용했다.

def solution(arr):
    answer = []
    answer.append(arr[0])
    for i in range(1, len(arr)):
        if not arr[i-1] == arr[i]:
            answer.append(arr[i])
    return answer

 

 

문제 2

문제설명:

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국 중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

 

이번 문제는 조합의 문제이다. 즉, 순서가 달라도 같은 원소를 가지면 하나의 경우로 판단하는 것이다. 따라서 3중 for문을 사용해서

각각의 for문 안에서 탐색할 인덱스 값을 하나씩 늘려줌으로써 겹치는 부분을 고려하지 않도록 했다.

def solution(number):
    answer = 0
    for i in range(len(number)):
        for j in range(i+1,len(number)):
            for k in range(j+1, len(number)):
                if number[i] + number[j] + number[k] == 0:
                    answer+=1
    return answer

 

for문을 3개 쓰는 것보다 더 나은 풀이를 보고 싶어 다른 사람의 풀이를 보니 combination라이브러리를 사용했다..

파이썬은 아무래도 다양하고 많은 라이브러리를 지원해 주는 것에 장점이 있다 보니 어느 정도 아는 것이 필요해 보인다.

대충 찾아보니 코테에서 도움이 될만한 라이브러리가 몇 개 있는 것 같다. 다음에 정리해 보도록 하겠다.

#다른 사람의 풀이: 좋아요 가장 많이 받음
def solution (number) :
    from itertools import combinations
    cnt = 0
    for i in combinations(number,3) :
        if sum(i) == 0 :
            cnt += 1
    return cnt

itertools의 combinations라이브러리는 배열 안에서 조합에 필요한 원소를 지정해 주면 알아서 조합을 추출해 준다.

즉, iteration마다 i에 number에서 3가지를 뽑은 조합을 제공한다.

그 조합에서 합이 0인 경우에 cnt를 하나 늘려 몇 개 있는지 파악하는 로직이었다.