IT 정리용 블로그!

[단계별로 풀어보기-7 문자열 단계] 11654,11720,10809,2675,1157,1152,2908,5622,2941,1316 본문

Baek Joon

[단계별로 풀어보기-7 문자열 단계] 11654,11720,10809,2675,1157,1152,2908,5622,2941,1316

집가고시퍼 2022. 1. 16. 23:11
  • [11654]
    Q : 알파벳 소문자, 대문자, 숫자 0~9 중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성해라

    A :


  • [11720]
    Q : 첫 줄에 숫자의 개수가 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다. 숫자 N개의 합을 출력해라

    A :
    for i in x, tot+=int(i)로도 할 수 있다. 그리고 3번 줄에서 input()은 기본적으로 문자열을 받는다 생각하기 때문에 별도로 형을 바꿔줄 필요가 없다.


  • [10809]
    Q : 첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다. a가 처음 등장하는 위치, b가 처음 등장하는 위치,...,z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫번째 글자는 0번째 위치이다.

    A :
    find() 함수는 S(문자열)안에 해당 문자(i)(chr)이 있는지 찾는다. 만약 있으면 그 문자가 첫 번째로 위치한 인덱스를 출력하고, 없으면 -1을 출력한다.
    이 방법이 아니더라도, 5번 줄 부터 if i in S: print(S.index(i)), else: print(-1)으로 할 수도 있다.
    find와 index 함수는 공통적으로 문자열 안에서 문자의 위치를 찾는다. 그리고 (찾을 문자,시작점,종료점)의 입력이 공통적으로 가능하다. 숫자가 한 개이면 시작점, 2 개면 시작점과 종료점을 나타낸다. index('x',2)면 문자열의 둘째 위치부터 처음 'x'가 위치한 자리를 찾는 것이고, find('o',1,3)은 1~3번째 사이에 'o'가 위치한 자리를 찾는 것이다.
    차이점은 find()는 찾는 값이 없을 경우 -1을 출력한다는 것이고, index()는 찾는 문자가 없을 경우 에러가 발생한다는 것이다. (https://ooyoung.tistory.com/78)


  • [2675]
    Q : 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 출력하는 프로그램을 작성해라.
    첫 줄에 테스트 케이스틔 개수가 주어진다. 각 테스트 케이스는 반복횟수R, 문자열 S가 공백으로 구분되어 주어진다. 각 테스트케이스에 대해 P를 출력해라. 3 ABC => AAABBBCCC

    A :
    4번 line에서 굳이 map을 안쓰고 input().split()만 써도 된다. 기본적으로 str 형태로 입력을 받기 때문. 그리고 map(input().split())만 시도해 보았으나, 이건 안된다.
    그리고 위 코드는 S 속의 각 글자를 출력하는 것을 R번 반복하는 방식이다. 하지만 4번 line 뒤에 P=''을 두고, 6번 line 대신 P+=j*int(R)을 하고, 5번 line loop의 밖에서 print(P)를 해줘도 된다.


  • [1157]
    Q : 알파벳 대소문자로 이루어진 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우엔 ?를 출력한다. 사용된 알파벳을 샐 때는 대소문자를 구분하지 않는다.

    A :
    1번 line에서 str.upper() 함수는 문자열의 소문자와 대문자들을 모두 대문자로 바꿔준다.
    6번 line에서 str.count() 함수는 해당 문자열에서 문자 i가 몇 번 등장하는지 알려준다. 9번 line에서도 list.count(max(cnt))는 cnt에서 가장 큰 값(index가 아님)이 list에 몇 번 등장하는지 세준다.


  • [1152]
    Q : 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 단어 개수를 출력해라.

    A :


  • [2908]
    Q : 두 수 A, B가 공백을 두고 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.
    이 중, 각 수의 자릿수를 뒤집은 것 중 큰 수를 출력해라

    A :
    문자열에 [::-1]을 하면 거꾸로 뒤집는다.


  • [5622]
    Q :
    숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다. 알파벳 대문자로 이루어진 단어가 주어지면, 다이얼을 걸기 위해 필요한 시간을 출력해라

    A : 



  • [2941]
    Q : 크로아티아 알파벳     변경
    č c=
    ć c-
    dz=
    đ d-
    lj lj
    nj nj
    š s=
    ž z=
    전에는 크로아티아 알파벳을 입력할 수 없어서 다음과 같이 변경해서 입력했었다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력해라

    A :
    word.replace(i,'*')는 문자열에서 i를 찾아 *로 바꾼다. 이는 두 개 이상의 문자가 i에 들어가 있을 때도 사용된다. 2번 line에서 c=가 i에 들어가기도 하는데, 이런 경우 두 문자를 하나의 *로 바꾼다. ac=i가 a*i로 바뀌는 식이다.


  • [1316]
    Q : ccaazzzzbb는 c,a,z,b가 연속해서 나타나고, kin은 k,i,n이 연속해서 한 번만 나타나므로 그룹단어지만, aabbcccb는 b가 떨어져서 나타나므로 그룹 단어가 아니다.
    첫째 줄에는 단어의 개수 N이 입력되고, 둘째 줄부터 줄을 바꿔가며 단어들이 들어온다. 그룹 단어의 수를 출력해라.

    A :
    이 문제에서 문자가 바뀌지 않은 경우는 그냥 넘어가도 된다. aabbcccc에서, i=0일 때는 word[i]==word[i+1]==a이므로 그냥 넘어간다. 하지만 i=1일 때는 a,b로 문자가 바뀌니, word[j+1:]에 해당 문자가 존재하는지 체크한다. 어차피 뒤에 a가 다시 등장하는지 아닌지는 모든 word[i]==a일 때마다 체크할 필요는 없다. 어차피 a가 연속되어 나왔다면, 한 번만 체크하면 되기 때문이다.
    line 9는 elif word[j] in word[j+1:]로도 쓸 수 있다.
    이 문제에서는 cnt를 N에서 하나씩 줄여나가는 방식이 용이했다. 처음에는 cnt를 늘려나가는 방식을 사용했었지만, 이 문제에서는 word 속의 모든 문자들에 대해 뒤쪽에 중복이 한 번이라도 일어나는지 확인하는 알고리즘을 사용했다. 그것이 line 9인데, 구조상 에러가 나는 경우에 loop로 들어간다. 때문에 cnt를 줄여나가는 방식이 편하다. 때에 따라 cnt를 늘려가는 것만이 아닌, 줄여가는 것이 용이할 때도 있다.
Comments