문제
UCPC 초등학교의 체육대회 날이 다가오고 있다. UCPC 초등학교 1학년 1반의 학생들은 담임 선생님 종서의 지시에 맞춰 특정한 방향을 바라보는 연습을 하고 있다.
학생들은 초기에 북쪽을 바라보고 있으며, 종서는 다음과 같은 형태의 지시를 총 열 번 내린다:
- 우향우: 각 학생은 현재 상태에서 오른쪽으로 도 돈다.
- 뒤로 돌아: 각 학생은 현재 상태에서 오른쪽으로 도 돈다.
- 좌향좌: 각 학생은 현재 상태에서 왼쪽으로 도 돈다.
종서는 초등학생들이 지시를 정확하게 이행하는 것이 어렵다는 것을 인지하고, 학생들이 자신의 지시를 성공적으로 따른다면 사탕을 나누어 주기로 했다. 학생들을 도와 담임 선생님 종서의 지시대로 바라보는 방향을 바꾸었을 때, 최종적으로 바라보는 방향을 구해보자.
입력
t_i (1 ≤ t_i ≤ 10)가 한 줄에 하나씩 주어진다. 의 값은 , , 중 하나로,
개의 줄에 걸쳐 종서가 내린 각 지시에 대한 정보를 나타내는 정수- t_i = 1 이라면 번째 명령이 우향우임을,
- 번째 명령이 뒤로 돌아임을, 라면
- t_i = 3 이라면 번째 명령이 좌향좌임을
나타낸다.
출력
N, 동쪽이라면 E, 서쪽이라면 W, 남쪽이라면 S를 출력한다.
개의 지시를 모두 이행한 후 학생들이 바라보는 방향을 나타내는 문자를 출력한다. 학생들이 바라보는 방향이 북쪽이라면풀이 과정
10개의 지시를 모두 수행한 뒤의 방향을 출력해야 한다.
방향 처리를 조금 쉽게 하기 위해, 조건적인 나머지 연산을 이용할 수 있다.
북 -> 동 -> 남 -> 서 순으로 시계 방향으로 각각 0, 1, 2, 3 이라는 숫자를 대응시킨 후,
우향우를 하면 시계 방향으로 돌기 때문에 1을 더해주고, 좌향좌를 하면 반시계 방향으로 돌기 때문에 1을 빼준다.
유의해야 할 0 -> 3 이나 3 -> 0 같은 부분은 조건문으로 처리해서 방향이 잘 이어지도록 해주면 된다.
뒤로 돌아는 시계 방향이든 반시계 방향이든 2를 더해주거나 2를 빼주면 된다. 다만 0 -> 3 을 지나거나 3 -> 0 을 지날 때 처리를 중요시 해준다.
이러한 복잡한 처리보다 더 쉬운 방법이 있다. 나머지 연산을 사용하는 것이다.
어떠한 정수를 4로 나눈 나머지는 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3... 으로 반복되므로, 이러한 성질을 이용해 나머지 연산을 이용하여 시계 방향으로 돌거나 반시계 방향으로 돌았을 때 방향 정보를 구할 수 있다.
북 -> 동 -> 남 -> 서 방향으로 1번 회전 ( 우향우 1번 ) 하는 것은 1을 더하는 것이고, 뒤로 도는 것은 2를 더하는 것이다.
좌향좌는, 우향우를 3번 해주면 좌향좌가 된다! 3을 더해주면 북 -> 서 -> 남 -> 동 순으로 회전하는 것이 가능하다.
우향우 : (dir + 1) % 4
0 (북) -> (0 + 1) % 4 -> 1 (동)
1 (동) -> (1 + 1) % 4 -> 2 (남)
2 (남) -> (2 + 1) % 4 -> 3 (서)
3 (서) -> (3 + 1) % 4 -> 0 (북)
좌향좌 : (dir + 3) % 4
0 (북) -> (0 + 3) % 4 -> 3 (서)
1 (동) -> (1 + 3) % 4 -> 0 (북)
2 (남) -> (2 + 3) % 4 -> 1 (동)
3 (서) -> (3 + 3) % 4 -> 2 (남)
뒤로 돌아 : (dir + 2) % 4
0 (북) -> (0 + 2) % 4 -> 2 (남)
1 (동) -> (1 + 2) % 4 -> 3 (서)
2 (남) -> (2 + 2) % 4 -> 0 (북)
3 (서) -> (3 + 2) % 4 -> 1 (동)
나머지 연산으로 방향을 처리할 수 있는, 알아두면 좋은 테크닉이다.
C
#include <stdio.h>
int main(void) {
char dir_alpha[4] = {'N', 'E', 'S', 'W'};
int dir = 0;
int tmp;
for (int i = 0; i < 10; i++) {
scanf("%d", &tmp);
if (tmp == 1) dir = (dir + 1) % 4; // 우향우
else if (tmp == 2) dir = (dir + 2) % 4; // 뒤로 돌아
else dir = (dir + 3) % 4; // 좌향좌
}
printf("%c", dir_alpha[dir]);
return 0;
}
Python
dir = ['N', 'E', 'S', 'W']
now = 0
for _ in range(10):
n = int(input())
if n == 1: now = (now + 1) % 4
elif n == 2: now = (now + 2) % 4
else: now = (now + 3) % 4
print(dir[now])
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1152 : 단어의 개수 ( BRONZE 2 ) / Python (0) | 2023.09.30 |
---|---|
[ BOJ ] 11943 : 파일 옮기기 ( BRONZE 4 ) / C, Python (0) | 2023.09.28 |
[ BOJ ] 2675 : 문자열 반복 ( BRONZE 2 ) / C, C++, Python, Java (0) | 2023.09.26 |
[ BOJ ] 10809 : 알파벳 찾기 ( BRONZE 2 ) / C, C++, Python, Java (0) | 2023.09.26 |
[ BOJ ] 25628 : 햄버거 만들기 ( BRONZE 4 ) / C, Python (0) | 2023.09.26 |