문제 설명


숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 게임해보기

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

* 숫자는 맞지만, 위치가 틀렸을 때는 볼
* 숫자와 위치가 모두 맞을 때는 스트라이크
* 숫자와 위치가 모두 틀렸을 때는 아웃

예를 들어, 아래의 경우가 있으면

A : 123
B : 1스트라이크 1볼.
A : 356
B : 1스트라이크 0볼.
A : 327
B : 2스트라이크 0볼.
A : 489
B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.

질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

 

제한조건

 

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

 

 

입출력 예

 

baseball return
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

 

나의 풀이

 

from itertools import permutations

def solution(baseball):
    a=list(permutations(range(1,10),3))
    r=0
    for i in a:
        ans=i
        c=0
        for b in baseball:
            st=0
            ba=0
            ch=list(map(int,(str(b[0]))))
            for j in range(3):
                if ans[j] == ch[j]:
                    st += 1
            for k in ch:
                if k in ans:
                    ba += 1
            ba -= st
            if b[1] == st and b[2] == ba:
                c += 1
        if c == len(baseball):
            r += 1
    return r

1. 1부터 9까지 중 숫자야구의 숫자가 될 수있는 것을 순열을 이용해 뽑습니다.
2. 해당 숫자가 baseball을 통해 숫자야구의 답이 될 수 있는지 확인합니다.
2-1. 스트라이크의 개수를 구합니다.
2-2. 볼의 개수를 구합니다. 볼의 개수를 구하는 것에 스트라이트도 포함되어 있기 때문에 스트라이크
개수를 뺍니다.
2-3. 스트라이크와 볼의 개수가 baseball의 개수와 같은지 확인합니다.
2-4. 각 baseball의 경우를 계산하고 c가 baseball의 길이와 같으면 숫자야구의 답이 될 수 있기 때문에 r에 1을 더합니다.
3. 순열에 대해 모두 검사하고 r을 리턴합니다.

 


프로그래머스 '숫자 야구' : https://programmers.co.kr/learn/courses/30/lessons/42841

 

코딩테스트 연습 - 숫자 야구

[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

programmers.co.kr

 

문제 설명


한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

 

제한조건

 

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

 

 

입출력 예

 

numbers return
17 3
011 2

 

입출력 예 설명


예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.

 

나의 풀이

 

from itertools import permutations

def solution(numbers):
    r=[]
    for i in range(1,len(numbers)+1):
        for j in permutations(list(numbers),i):
            jj=int(''.join(j))
            for k in range(2,jj):
                if jj % k == 0:
                    break
            else:
                if jj not in r and jj != 0 and jj != 1:
                    r.append(jj)
    return len(r)

1. 문자열 numbers를 한자리의 수부터 len(numbers)의 수까지 순열로 만듭니다.
2. 각각의 수가 소수인지 검사하여 소수이면 리스트 r에 넣습니다.
3. 리스트 r에 있는 소수의 개수를 리턴합니다.

 


프로그래머스 '소수 찾기' : https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 �

programmers.co.kr

 

문제 설명


Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한조건

 

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

 

 

입출력 예

 

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

 

나의 풀이

 

def solution(brown, yellow):
    s = brown + yellow
    for i in range(s,2,-1): # 가로
        if s % i == 0:
            a= s // i
            if yellow == (i-2)*(a-2):
                return [i, a]

1. brown과 yellow를 더합니다. (전체 카펫의 칸)

2. for문을 통해 가로를 확인합니다. i로 나눠지면 i가 가로, a는 세로

3. (i-2)(a-2)가 yellow이면 [i, a]를 리턴합니다.

 


프로그래머스 '카펫' : https://programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 ��

programmers.co.kr

 

문제 설명


수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한조건

 

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

 

입출력 예

 

answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

입출력 예 설명


입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

 

나의 풀이

 

def solution(answers):
    a1 = [1, 2, 3, 4, 5]
    a2 = [2, 1, 2, 3, 2, 4, 2, 5]
    a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    c1, c2, c3=0, 0, 0
    for i in range(len(answers)):
        s1 = i % 5
        s2 = i % 8
        s3 = i % 10

        if a1[s1] == answers[i]:
            c1 += 1
        if a2[s2] == answers[i]:
            c2 += 1
        if a3[s3] == answers[i]:
            c3 += 1
            
    k=max(c1,c2,c3)
    answer=[]

    if k == c1:
        answer.append(1)
    if k == c2:
        answer.append(2)
    if k == c3:
        answer.append(3)
    
    return answer

 

1. 각 수포자가 찍는 방식을 a1, a2, a3에 저장합니다.

2. 문제에 따라 찍을 숫자와 정답이 같은 경우 맞춘 횟수를 올려줍니다.

3. 가장 많이 맞춘 횟수를 k에 저장해주고 리스트에 담아 출력해줍니다. 

 

 

다른 사람의 풀이

 

def solution(answers):
    pattern1 = [1,2,3,4,5]
    pattern2 = [2,1,2,3,2,4,2,5]
    pattern3 = [3,3,1,1,2,2,4,4,5,5]
    score = [0, 0, 0]
    result = []

    for idx, answer in enumerate(answers):
        if answer == pattern1[idx%len(pattern1)]:
            score[0] += 1
        if answer == pattern2[idx%len(pattern2)]:
            score[1] += 1
        if answer == pattern3[idx%len(pattern3)]:
            score[2] += 1

    for idx, s in enumerate(score):
        if s == max(score):
            result.append(idx+1)

    return result

enumerate를 이용해 answer의 값과 찍은 숫자가 같은 경우 맞춘 횟수를 올려줍니다.

enumerate를 이용해 가장 많이 맞춘 횟수의 값들을 리스트에 넣어줍니다.

 


프로그래머스 '모의고사' : programmers.co.kr/learn/courses/30/lessons/42840?language=python3

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 ��

programmers.co.kr

 

+ Recent posts