[백준|파이썬] 1138: 한 줄로 서기 (실버2)

2023. 6. 24. 20:11·Problem Solving/백준
반응형
문제

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

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다

www.acmicpc.net

 

 

🐍파이썬

먼저 주석이 없는 코드는 다음과 같다.

import sys, itertools
input=sys.stdin.readline
n = int(input())
dic = {idx+1:item for idx, item in enumerate(map(int, input().split()))}

for i in itertools.permutations([i for i in range(1, n+1)]):
    for j in range(len(i)): 
        cnt = 0 
        for k in i[:j]: 
            if k > i[j]:
                cnt += 1 
        if dic[i[j]] != cnt:   
            break
    else:
        print(' '.join(map(str, i)))
        break

 

코드 설명은 아래에 주석으로 달아두었다.

import sys, itertools
input=sys.stdin.readline
n = int(input())
#input이 2 1 1 0일 때, {1:2, 2:1, 3:1, 4:0}를 저장하는 사전 생성
#각 인덱스에 input을 하나씩 대입한다. 1번 사람의 왼쪽에 두사람이 존재하고, 2번 사람의 왼쪽에는 한 사람이 존재...
dic = {idx+1:item for idx, item in enumerate(map(int, input().split()))}

#1~n번까지, 정답이 될 수 있는 모든 순열을 확인한다.
#각 조합의 원소를 모두 확인하며, 각 원소의 왼쪽에 있는 사람의 수를 모두 확인할 예정
for i in itertools.permutations([i for i in range(1, n+1)]):
    #(ex. i == [2, 1, 4, 3])
    for j in range(len(i)): #각 순열 조합 중 첫번째 인덱스의 수부터 확인한다. (ex. 2부터 시작)
        cnt = 0 #왼쪽에 있는 사람 수
        for k in i[:j]: #현재 사람(i[j])의 왼쪽에 선 사람들을 모두 살피기(ex.if i[j] == 4이라면, [2, 1]을 확인)
            if k > i[j]:   #왼쪽에 서 있는 사람(ex.2)이 i[j](ex.4)보다 더 크다면
                cnt += 1    #카운트 증가
        #왼쪽 사람 수를 모두 확인 한 후에 dic[i[j]]에 저장된 값과 실제 카운트 값이 동일한지 확인
        #ex.동일하다면 현재 순열에서 4번 사람의 왼쪽에 4보다 더 큰 수의 사람이 dic[4](=0)명 서 있다는 뜻. 정답 순열일 가능성이 높아진다.
        #ex.동일하지 않다면 4번 사람의 왼쪽에 4보다 더 큰 수의 사람 0명이 서 있지 않다는 뜻이므로 해당 순열은 답이 될 수 없다.
        if dic[i[j]] != cnt:    #동일하지 않으면 break 하고 다음 순열을 확인
            break
    #하나의 순열을 무사히 돌았다면, 모든 사람이 입력받은 조건(ex.[2 1 1 0])에 맞게 서 있다는 뜻이므로
    #정답을 출력하고 break하여 다음 순열을 생성하기를 멈춘다.
    else:
        print(' '.join(map(str, i)))
        break

최대 인원수가 10이므로, itertools.permutations을 이용해 가능한 모든 수열을 생성해 하나씩 확인하는 식으로 구현했다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'Problem Solving > 백준' 카테고리의 다른 글

[백준|파이썬] 2852: NBA 농구 (실버3)  (0) 2023.06.27
[백준|파이썬] 16506: CPU (실버5)  (0) 2023.05.06
[백준|파이썬] 3568: iSharp (실버5)  (0) 2023.05.05
[백준|파이썬] 14719: 빗물 (골드5)  (0) 2023.05.04
[백준|파이썬] 7568: 덩치 (실버5)  (2) 2023.04.30
[백준|파이썬] 4673: 셀프 넘버 (실버5)  (0) 2023.04.29
'Problem Solving/백준' 카테고리의 다른 글
  • [백준|파이썬] 2852: NBA 농구 (실버3)
  • [백준|파이썬] 16506: CPU (실버5)
  • [백준|파이썬] 3568: iSharp (실버5)
  • [백준|파이썬] 14719: 빗물 (골드5)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 프로그래밍
        • Programming
        • C | C++
        • Java
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    spring boot
    클론 프로젝트
    Jiraynor Programming
    블로그 제작
    bfs
    React
    강의내용정리
    SWEA
    자바스크립트
    리액트
    자바
    백준
    AWS
    Til
    프로젝트
    ZeroCho
    타입스크립트
    포트폴리오
    컴퓨터네트워크
    알고리즘
    웹사이트
    d3
    공식문서
    파이썬
    mysql
    프로그래머스
    뉴렉처
    플러터
    Next.js
    구현
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[백준|파이썬] 1138: 한 줄로 서기 (실버2)
상단으로

티스토리툴바