일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Greedy
- kakao
- array
- Netflix
- 백준
- benefits
- 수능
- review
- 넷플릭스
- silver
- 2020
- 영어
- 영화
- BOJ
- coding
- usaco
- parametric search
- Movie
- Recursive
- 완전탐색
- 나는솔로
- BFS
- health
- 알고리즘
- 리뷰
- 추천
- 해설
- 코딩 테스트
- Algorithm
- 카카오
Archives
- Today
- Total
Young
CPU 본문
728x90
반응형
문제를 풀어본 후 해설을 보시면 좋습니다 !! ^ㅡ^
예상 난이도 : 2 / 10
이번 문제는 'CPU' (https://www.acmicpc.net/problem/16506) 입니다.
전형적인 구현 문제 입니다.
이 문제가 좋다고 생각한 이유는 '문자열 처리와 비트 연산에 대해서 연습할 수 있는 문제'이기 때문입니다.
문제는 명령어 끝에 'C'가 붙어 있으면 opcode 마지막 값이 1 이라는 것을 확인하고, ADD부터 RRC까지 1씩 증가하고
있다는 것을 확인한 후 코드를 짜면 더 쉽게 짤 수 있을 것 입니다.
명령어가 16bit 이므로 int 변수에서 처리해도 충분합니다.
그리고 '<<' shift 연산자를 잘 이용하면 편리하겠죠.
1 | string op[] = { "ADD","SUB","MOV","AND","OR","NOT","MULT","LSFTL","LSFTR","ASFTR","RL","RR" }; | cs |
저 같은 경우는 이런 식으로 명령어를 저장해 놓고 풀었습니다.
하지만 명령어가 몇 번째에 있는지 일일이 루프를 돌면서 찾는 것은 너무 비효율적입니다.
효율을 높이기 위해서는 c++ 에서 map 이라는 자료구조를 사용하는 것이 좋겠죠.
1 2 3 | map<string, int> mp; for (int i = 0; i < 12; i++) mp[op[i]] = i; | cs |
그래서 이런 식으로 맵에 집어넣고
1 | int opcode = mp[k] << 1; | cs |
이런식으로 한 번에 찾았습니다.
문제의 그림에 설명되어 있는대로 opcode ->레지스터 번호를 구현하면 됩니다.
한 단계씩 진행하면서 '<<' shift 연산자를 알맞게 이동해주면서 값을 더해주면 되겠습니다.
728x90
반응형
'코딩 테스트 대비 추천 문제' 카테고리의 다른 글
Round Robin (0) | 2019.03.11 |
---|---|
LRU Caching (0) | 2019.03.10 |
개미 (0) | 2019.03.09 |
경매 (0) | 2019.03.09 |
BOJ를 체계적으로 풀어보자! (0) | 2019.02.20 |