Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 완도산회
- dp
- 스프링
- Spring
- Servlet
- 호유동
- 투어
- mvc
- 동적 프로그래밍
- BFS
- 쓰레드 풀
- 맛집 투어
- 프로그래머스
- 문자열 압축
- 설탕 배달
- 백준
- 2638
- 2589
- 2020 KAKAO BLIND
- 포두부 보쌈
- HTTP API
- 맛집
- 양꼬치
- 2839
- 알고리즘
- 고모네 콩탕
- 다이나믹 프로그래밍
- 스프링 MVC
- 서블릿
- 1로 만들기
Archives
- Today
- Total
프로그래밍 공방
[백준] 5676번 : 음주 코딩 본문
문제
5676번: 음주 코딩
각 테스트 케이스마다 곱셈 명령의 결과를 한 줄에 모두 출력하면 된다. 출력하는 i번째 문자는 i번째 곱셈 명령의 결과이다. 양수인 경우에는 +, 음수인 경우에는 -, 영인 경우에는 0을 출력한다.
www.acmicpc.net
문제해결방법
이 문제는 세그먼트 트리로 구간의 곱을 구해놓고 값을 변경시켜주면서 풀었다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | package baekjoon; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.StringTokenizer; public class Main5676_음주코딩 { public static int[] XI, segmentTree; public static int getNumberSign(int number) { if(number>0) return 1; else if(number<0) return -1; else return 0; } public static void makeTree(int index, int s, int e) { if(s==e) { segmentTree[index] = XI[s]; return; } int mid = (s+e)>>1; makeTree(index*2, s, mid); makeTree(index*2+1, mid+1, e); segmentTree[index] = segmentTree[index*2]*segmentTree[index*2+1]; } public static int query(int index, int s, int e, int si, int ei) { if(si>e || ei<s) return 1; if(si<=s && e<=ei) return segmentTree[index]; int mid = (s+e)>>1; return query(index*2, s, mid, si, ei) * query(index*2+1, mid+1, e, si, ei); } public static void update(int index, int s, int e, int ui, int diff) { if(ui>e || ui<s) return; if(s==e) { segmentTree[index]=diff; return; } int mid = (s+e)>>1; update(index*2, s, mid, ui, diff); update(index*2+1, mid+1, e, ui, diff); segmentTree[index] = segmentTree[index*2] * segmentTree[index*2+1]; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String start; while((start = br.readLine())!=null) { StringTokenizer st = new StringTokenizer(start); int N = Integer.parseInt(st.nextToken()); int K = Integer.parseInt(st.nextToken()); XI = new int[N+1]; segmentTree = new int[4*N]; st = new StringTokenizer(br.readLine()); for(int i=1; i<=N; i++) XI[i] = getNumberSign(Integer.parseInt(st.nextToken())); makeTree(1, 1, N); for(int i=0; i<K; i++) { st = new StringTokenizer(br.readLine()); char op = st.nextToken().charAt(0); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); switch(op) { case 'P': int result = query(1, 1, N, a, b); if(result>0) bw.write('+'); else if(result<0) bw.write('-'); else bw.write('0'); break; case 'C': b = getNumberSign(b); XI[a] = b; update(1, 1, N, a, b); break; } } bw.write('\n'); } bw.flush(); bw.close(); br.close(); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[프로그래머스] 다트 게임 (0) | 2021.02.10 |
---|---|
[프로그래머스] 메뉴 리뉴얼 (0) | 2021.02.08 |
[프로그래머스] 순위 검색 (0) | 2021.02.04 |
[백준] 14425번 : 문자열 집합 (0) | 2021.02.02 |
[프로그래머스] 외벽 점검 (0) | 2021.01.29 |