맨땅에 헤딩하는 사람

Python 도식추리 문제 출제 프로그램 본문

파이썬/구현

Python 도식추리 문제 출제 프로그램

purplechip 2020. 7. 12. 11:18

목디스크가 걸려서 예전에 만들어놨던 프로그램을 지금 업로드한다.

물론 GSAT은 떨어졌다. 목디스크가 걸려서 프로그램을 만들어놓고 제대로 연습도 못했다. ㅠㅠ

여하튼 코드를 공개하고 필요한 사람이 있으면 도움이 됐으면 하는 바람이다.

 

도식추리문제란 직무적성검사에서 항상 출제되는 유형의 문제이다. 

[그림 1. 도식추리 문제 유형]

다음과 같이 어떤 도형이 문자열의 순서를 바꾸거나 문자를 증감시키는 조건을 파악하여 주어지는 문자열이 해당 도형에서 어떤 문자열로 바뀌는 지를 추리하는 문제다. 유형에 익숙해지면 시간 단축을 꼭 해야하는 거저주는 문제로 대표되는데 이를 위해 훈련이 필요하다 판단하여 간단한 파이썬 프로그램을 만들었다.

[그림 2. 코드 실행 결과]

프로그램은 그림 2와 같이 진행된다. LOCATION은 위치 바꾸기, OPERATION은 증감이다. 각 모드를 선택할 수 있고 ALL은 두 가지가 혼합되어 출제되는 형식이다.

 

코드는 다음과 같다.

import string
import time
from enum import IntEnum, unique
import random

@unique
class Mode(IntEnum):
    LOCATION = 1
    OPERATION = 2
    ALL = 3

if __name__ == '__main__':
    mode = int(input('Select Mode (LOCATION:1, OPERATION:2, ALL:3) '))
    mode_list = (Mode.LOCATION, Mode.OPERATION)
    mode_all = None
    word_list = string.ascii_uppercase  #ABCDEFG...XYZ    
    problem_type = ('src', 'des', 'ans')
    print("\nYou have to put answer in this rule")
    print("[TYPE1] ? → -4-30-3 → WWYC : AZYF")
    print("[TYPE2] AZYF → -4-30-3 → ? : WWYC")
    print("[TYPE3] AZYF → ? → WWYC : -4-30-3")
    print("It is also same on LOCATION Mode\n")
    print("If you want to quit, input 'q'.")

    while True:
        if mode == Mode.ALL:
            mode_all = random.choice(mode_list)
       
        src = []; des = []; answer = []
        while True:
            word = random.choice(word_list)
            if word not in src:
                src.append(word)
                if len(src) == 4:
                    break
                
        if mode == Mode.LOCATION or mode_all == Mode.LOCATION:
            str_mode = 'LOCA'
            answer = [1, 2, 3, 4]
            random.shuffle(answer)
            des = [None for none in range(4)]
            for i, value in enumerate(answer):
                '''
                number that change location is a way from source to destination
                if you wanna change direction from destination to source,
                you should change below code like 
                src[i] = des[value-1]
                '''
                des[i] = src[value-1] # i starts 0, value starts 1
                                      
        elif mode == Mode.OPERATION or mode_all == Mode.OPERATION:
            str_mode = 'OPER'
            for i in range(4):
                num = random.randint(-5,5) # -5 <= num <= 5
                word = ord(src[i]) + num
                if word < ord('A'):
                    word = ord('Z') - (ord('A') - word - 1)
                elif word > ord('Z'):
                    word = ord('A') + (word - ord('Z') - 1)
                des.append(chr(word))
                answer.append(num)
        
        str_src = ''; str_des = ''; str_ans = ''
        for i in range(4):
            str_src = str_src + src[i]
            str_des = str_des + des[i]
            str_ans = str_ans + str(answer[i])
            
        p_type = random.choice(problem_type)
        start = time.time()
        if p_type == 'src':
            input_answer = input('[{}] ? → {} → {} : '.format(str_mode, str_ans, str_des))
            if input_answer == 'q':
                break
            end = time.time()
            if input_answer == str_src:
                print('Correct! It took {:.2f} second(s).'.format(end-start))
            else:
                print('Wrong! It took {:.2f} second(s).'.format(end-start))
                print('Answer is {}.'.format(str_src))            

        elif p_type == 'des':
            input_answer = input('[{}] {} → {} → ? : '.format(str_mode, str_src, str_ans))
            if input_answer == 'q':
                break
            end = time.time()
            if input_answer == str_des:
                print('Correct! It took {:.2f} second(s).'.format(end-start))
            else:
                print('Wrong! It took {:.2f} second(s).'.format(end-start))
                print('Answer is {}.'.format(str_des))     
        
        else:
            input_answer = input('[{}] {} → ? → {} : '.format(str_mode, str_src, str_des))
            if input_answer == 'q':
                break
            end = time.time()
            if input_answer == str_ans:
                print('Correct! It took {:.2f} second(s).'.format(end-start))
            else:
                print('Wrong! It took {:.2f} second(s).'.format(end-start))
                print('Answer is {}.'.format(answer))     

위치 바꾸기 문제(LOCATION)는 두 가지의 위치 처리 방법이 있다.

가령, ABCD → ★ → ADBC 일 때 ★이 두 가지의 답으로 정의될 수 있다.

(1) ★ : 1342

(2) ★ : 1423

이는 시작 문자열을 기준으로 할 것이냐, 바뀐 문자열을 기준으로 할 것인가에 따라 다르게 나뉘는데 본인한테 편한 방법을 이용하면 된다. 나는 (2)의 방법을 선호한다. 위 코드는 (2)를 기준으로 작성되었으며 만약 (1)로 하고 싶다면 코드에서 "number that change ... src[i] = des[value-1]" 로 되어있는 부분에 맞춰 아래 코드를 수정하면 된다. 

 

Comments