ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 > Python3 > 7513번 : 준살 프로그래밍 대회
    알고리즘/쉬운 문제 2020. 2. 26. 04:31

    이번 포스팅은 준살 프로그래밍 대회라는 문제군요!

    문제를 풀다가 느꼈는데 네가 막 쓰고있는 신택스/문법들이 초보자분들에게는

    어색하게 느껴질 수 있다고 느껴서 쉬운버젼과

    제가 잘 쓰는 문법버젼으로 둘 다 적어야겠다고 생각했습니다.

    아마도 파이썬 신택스/문법에 관한 섹션을 따로 만들어야할 것 같기도 하네요.

     

    그럼 시작해보도록 하겠습니다^^

     

    문제

    준규는 해빈이의 위대함을 전세계에 알리기위해서 프로그래밍 대회를 개최하려고 한다.

    대회를 준비하던 중, 잠시 페이스북에서 Poke에 집중하느라 참가 신청을 구현하지 못했다.

    대회에 참가하는 사람들은 모두 아이디와 비밀번호를 이용해 시스템에 로그인해야 한다.

    참가 신청을 구현하지 않았기 때문에, 모든 사람들의 아이디는 "userN" 형식이다.

    비밀번호는 사람들이 추측할 수 없게 만들어야 한다.

    추측하거나 패턴이 뻔한 경우에는 대회 도중에 다른 사람의 아이디로 로그인을 할 수 있기 때문이다.

    비밀번호를 랜덤을 이용해 만들면, 입력하기가 약간 어려울 수 있다.

    따라서, 사전에서 단어 N개를 찾아 화면에 띄운 다음,

    입력해야 하는 단어 순서를 알려주는 방식을 사용하기로 했다.

    단어의 목록과 각 참가자의 순서가 주어졌을 때, 모든 사람의 비밀번호를 구하는 프로그램을 작성하시오.

     

    풀이

    보통 처음 접하시는 분들이 굉작히 착각하시는게

    여기 있는 문제는 모두 어렵고 뭔가 엄청난 준비를 해야지

    시작할 수 있다고들 생각해요. 하지만! 전혀 그렇지 않다는거.

     

    몇몇 자주 사용하는 함수들과 기본 문법만 익힌다면

    얼마든지 풀 수 있는 쉬운 문제도 엄청 많아요.

    그런 문제들을 차근차근 밟아나가면

    결국! 상위권에 도달 할 수 있겠죠??라고 저는 바랍니다ㅎㅎ

    저도 아직 쪼랩 ㅠㅠ

     

    이번 문제는 이전 문제와는 다르게 본문은 짧네요.

    하지만 이번에는 입력량이 많네요. 근데 이거는 그래도

    압박은 덜하네요. 본문이 많으면 다 풀었는데도 압박이 ;;

     

    문제는 간단해요. 주절주절 말하지만 결론은 비밀번호를 만드는 거죠.

    마지막 문장에 팍! 알려주고 있죠.

    그러면 남은건 비밀번호를 어떻게 만드는 것인가??

     

    일단 사전이 주어지죠. 그리고 사전에 있는 어떤 단어를

    어떤 순서로 조합할 것인가?? 이걸 구현해주면 끝!

     

    이번에는 일단 코드를 먼저 보여드릴께요!

    for n in range(int(input())):
        dic=[input()for i in range(int(input()))]
        password=[]
        for _ in range(int(input())):
            current=""
            for i in map(int,input().split()[1:]):
                current+=dic[i]
            password+=current,
        print("Scenario #%d:"%(n+1))
        for p in password:
            print(p)
        print()

    일단 두번째 줄의 dic을 보시면

    [input()for i in range(int(input()))]는 list comprehension이라는 신택스/문법이에요.

    보통은 루프를 돌려서 정한값들을 특정 리스트에 넣어주는 작업을 많이 하잖아요??

    하거든요. 그런데 이 list comprehension이 있으면 따로 넣어주는 작업없이 바로

    for루프를 감싸고 있는 리스트에 정한 값들을 넣어주는 표현이에요.

     

    좀 더 일반적인 형태를 보자면

    [ f(i) for i in range(n)] f(i)는 함수로 보시면 되는데 for 루프를 돌려서 i를 이용해서

    새로운 값을 만든다는 의미에요. 

     

    좀 더 구체적인 예를 보면 [ i for i in range(5)] 는 0-4가 들어 있는 리스트를 만드는 표현이고

    [2*i for i in range(5)] 여기서는 루프를 통해서 나오는 값에 2를 곱해서 리스트에 저장한다는 표현이에요.

     

     그리고 6번째 줄에 보시면 map(int, input().split())이 있는데 --> split()[1:]인데 이건 뒤에서 설명할게요

    여기서 input()은 입력받는 다는거로 다들 아실거고 split()은 문자열을 나눠준다는 의미인데요.

    인자가 없으면 공백문자로 자른다는 의미에요. 만약 input으로 "0 0 0 0"을 받는다면

    결과는 ["0", "0", "0", "0"]인 리스트가 나오게 되어요!!

     

    map함수는 두개의 인자를 받는데 첫번째는 함수명이고 두번째는 리스트 혹은 iterator라고 불리는 객체를 받는데

    여기서는 그냥 리스트라고 알고 있으시면 될거에요.

    그러면 어떤 일이 발생하느냐! 두번째 인자인 리스트에서 하나씩 꺼내서 첫번째 인자인 함수에 인자로 넣고

    그 함수의 결과값을 하나의 리스트에 넣고 generator라는 유사리스트에 반환해주게 되죠.

    이 generator는 유사리스트라서 인덱스로 접근은 불가능하지만

    for 루프에서 in 뒤에서는 사용이 가능해서 편리해요.

    그리고 리스트로 만들 수도 있는데 그건 다음에 또 설명할게요^^

    글이 점점 길어진다....ㅠㅠ

     

    이러면! 번거롭게 for루프들을 쓸 필요없이

    간단하게 하나의 문자열을 받아서 여러개의 수로 쪼갤 수 있게 되는거에요.

     

    자 그리고 password+=current, 는 뒤에 (,) 콤마/쉼표 보이시죠?? 이렇게 적어주면

    왼쪽의 리스트에 오른쪽의 객체를 add/append해주는 문법이 되는거에요.

    뭔 궂이 쓸 쓸요는 없지만 숏코딩을 생각한다면 한자라도 더 줄여줘야하기 때문에

    필요할 때가 있어요.

     

    마지막으로 쉽게 풀어쓴 코드입니다~

    for n in range(int(input())):
        dic=[]
        for i in range(int(input())):
            dic+=input(),
        password=[]
        for _ in range(int(input())):
            current=""
            for i in input().split()[1:]:
                current+=dic[int(i)]
            password+=current,
        print("Scenario #%d:"%(n+1))
        for p in password:
            print(p)
            print()

    적고 보니까 map은 쓸필요도 없었네요. 저는 항상 사용하다보니 손이 먼저 가버렸네요.^^;;

    적다보니까 확실히 파이썬 문법적인건 따로 적어야할듯한데 일단은 한동안은

    이런식으로 계속 가봐야겠네요.

     

    편 - 안 -

    끝 -

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

     

    7513번: 준살 프로그래밍 대회

    문제 준규는 해빈이의 위대함을 전세계에 알리기위해서 프로그래밍 대회를 개최하려고 한다. 대회를 준비하던 중, 잠시 페이스북에서 Poke에 집중하느라 참가 신청을 구현하지 못했다. 대회에 참가하는 사람들은 모두 아이디와 비밀번호를 이용해 시스템에 로그인해야 한다. 참가 신청을 구현하지 않았기 때문에, 모든 사람들의 아이디는 "userN" 형식이다. 비밀번호는 사람들이 추측할 수 없게 만들어야 한다. 추측하거나 패턴이 뻔한 경우에는 대회 도중에 다른 사람의

    www.acmicpc.net

     

Designed by Tistory.