danuri
오늘의 기록
danuri
전체 방문자
오늘
어제
  • 오늘의 기록 (307)
    • java (150)
      • java (33)
      • spring (63)
      • jpa (36)
      • querydsl (7)
      • intelliJ (9)
    • kotlin (8)
    • python (24)
      • python (10)
      • data analysis (13)
      • crawling (1)
    • ddd (2)
    • chatgpt (2)
    • algorithm (33)
      • theory (9)
      • problems (23)
    • http (8)
    • git (8)
    • database (5)
    • aws (12)
    • devops (10)
      • docker (6)
      • cicd (4)
    • book (44)
      • clean code (9)
      • 도메인 주도 개발 시작하기 (10)
      • 자바 최적화 (11)
      • 마이크로서비스 패턴 (0)
      • 스프링으로 시작하는 리액티브 프로그래밍 (14)
    • tistory (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • POSTGIS
  • reactive
  • S3
  • Thymeleaf
  • Saving Plans
  • Security
  • DDD
  • 등가속도 운동
  • RDS
  • PostgreSQL
  • docker
  • AWS
  • mockito
  • nuribank
  • 자바 최적화
  • connection
  • Jackson
  • 마이크로서비스패턴
  • Kotlin
  • 도메인 주도 설계
  • Bitmask
  • CICD
  • Database
  • ChatGPT
  • SWAGGER
  • 트랜잭션
  • Java
  • gitlab
  • Spring
  • JPA

최근 댓글

최근 글

hELLO · Designed By 정상우.
danuri

오늘의 기록

algorithm/problems

백준 1248 - Guess

2022. 10. 27. 14:11

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

 

1248번: Guess

Given a sequence of integers, a1, a2, …, an, we define its sign matrix S such that, for 1 ≤ i ≤ j ≤ n, Sij="+" if ai + … + aj > 0; Sij="−" if ai + … + aj < 0; and Sij="0" otherwise.  For example, if (a1, a2, a3, a4)=( −1, 5, −4, 2), then

www.acmicpc.net

 

 

풀이

1. 기본적으로 재귀를 이용한다. dfs(index + 1)을 계속 호출하면서 answer가 s 배열을 만족하는지 check 함수를 통해 확인한다.

2. 문제에서 중요한 힌트는 바로 answer[index]의 부호는 반드시 s[index][index]라는 것이다. 따라서, 재귀 호출 중 s[index][index]가 0이라면 answer[index]에 0을 넣고 다음 단계 dfs(index + 1)로 이동한다.

3. s[index][index]가 0이 아닌 경우, s가 +1 이라면 1 ~ 10, s가 -1이라면 -1 ~ -10을 answer에 넣어보면서 answer가 s 배열을 만족하는지 check 함수를 통해 확인하고, 다음 단계 dfs(index + 1)을 호출한다.

 

n = int(input())
data = input()
k = 0
s = [[0] * n for _ in range(n)]
for i in range(n):
    for j in range(i, n):
        if data[k] == '0':
            s[i][j] = 0
        elif data[k] == '-':
            s[i][j] = -1
        else:
            s[i][j] = 1
        k += 1


def check(index):
    total = 0
    for i in range(index, -1, -1):
        total += answer[i]
        if total == 0 and s[i][index] != 0:
            return False
        elif total < 0 and s[i][index] != -1:
            return False
        elif total > 0 and s[i][index] != 1:
            return False
    return True


def dfs(index):
    if index == n:
        return True

    if s[index][index] == 0:
        answer[index] = 0
        return dfs(index + 1)

    for i in range(1, 11):
        answer[index] = s[index][index] * i
        if check(index) and dfs(index + 1):
            return True
            
    return False


answer = [0] * n
dfs(0)
print(' '.join(map(str, answer)))
저작자표시 비영리 동일조건 (새창열림)

'algorithm > problems' 카테고리의 다른 글

백준 3665 - 최종 순위  (0) 2021.03.07
백준 2887 - 행성 터널  (0) 2021.03.06
커리큘럼  (0) 2021.03.06
알고리즘 문제 - 볼링공 고르기  (0) 2021.02.16
편집 거리  (0) 2021.02.05
    'algorithm/problems' 카테고리의 다른 글
    • 백준 3665 - 최종 순위
    • 백준 2887 - 행성 터널
    • 커리큘럼
    • 알고리즘 문제 - 볼링공 고르기
    danuri
    danuri
    IT 관련 정보(컴퓨터 지식, 개발)를 꾸준히 기록하는 블로그입니다.

    티스토리툴바